2013-08-16 45 views
1

我想了解一些使用多線程的高性能服務器程序的問題。Linux下的TCP/UDP高性能服務器

  1. epoll的可以處理TCP套接字監聽和插座連接,我可以在主線程中使用epoll_wait,如果有任何套接字連接正在添加,程序可以接受的工作線程的連接和recv數據。工作線程之間沒有衝突。我對嗎?

    udp是一個無連接的協議,我們可以同時在所有工作線程中使用recvfrom函數嗎?主線程只是使用epoll通知工作線程接收數據。 (假設我可以單獨處理每個UDP數據包)。

  2. 這是一個UDP服務器。 我將它設置爲無阻塞套接字。我在主線程中接收數據並處理它,然後將它發送到任務隊列,如果任務隊列有數據,則程序喚醒工作線程並鎖定任務隊列,然後從任務隊列獲取數據,解鎖任務使其他工作線程可以從任務隊列中獲取任務,然後進行處理。

    這是一個很好的多線程UDP服務器嗎?我不確定。 有UDP服務器的另一設計與高性能。

    我在這個問題困擾,非常感謝你!

+0

越高越好 –

回答

3

你的基本做法是正確的。首先研究臭名昭着的C10K問題以及如何克服它。一旦你瞭解了各種實現中的主要瓶頸,你需要考慮以下內容作爲你設計過程的一部分:

  • 最小化線程創建/刪除週期。
  • 始終在阻塞模型上選擇「基於事件」模型。

基本上一個線程每個請求模型優選用於其實施的簡單性。但它並不能很好地滿足併發請求的數量。在設計支持超過1000個併發請求所需的系統時,人們更喜歡使用線程上的套接字。

「工人線程」 實例化的最佳數量取決於:

  • 負載(數目的併發請求的)
  • 系統(CPU,RAM)

由於這是實施網絡服務器設計時非常流行的問題,因此您可以找到幾個分析,如this one,通過簡單搜索Apache vs. Nginx