簡體   English   中英

TCP / IP - 使用每個客戶端的線程方法解決C10K

[英]TCP/IP - Solving the C10K with the thread per client approach

在閱讀着名的C10k文章並在網上搜索自編寫之后事情如何演變之后,我想知道今天的標准服務器是否有可能使用每個連接的線程處理> 10000個並發 連接 (可能與一個線程池的幫助,以避免創建/終止進程)。


一些可能影響問題解決方法的細節:

  1. 輸入,中間處理和輸出。
  2. 每個連接的長度。
  3. 服務器的技術規格(核心,處理器,RAM等......)
  4. 將此系統與AIO,輪詢,綠色線程等替代技術相結合......

顯然我不是這方面的專家,所以任何評論或建議都將受到高度贊賞:)

絕對。 標准服務器可以使用每個連接一個線程的模型處理超過10K的並發 連接 我已經構建了這樣一個應用程序,五年前,它在標准Linux服務器上運行時每個進程的並發連接數超過50K。 如今,應該可以在當前硬件上運行具有超過250K並發連接的相同應用程序。

要記住的只有幾件事:

  • 使用線程池重用線程。 如果不使用線程,則無需終止線程,因為資源使用應針對峰值負載進行優化。
  • 堆棧大小:默認情況下,每個Linux線程為其堆棧保留8 MB。 對於10K線程,總計高達80 GB。 您應該將默認堆棧大小設置為64k到512k之間的某個值,這不是問題,因為大多數應用程序不需要更深的調用堆棧。
  • 如果連接是短暫的,則通過使用選項SO_REUSEPORT在同一端點上創建多個套接字來優化新連接。
  • 增加用戶限制: open files (默認1.024), max user processes
  • 增加系統限制,例如/proc/sys/kernel/pid_max (默認為32K), /proc/sys/kernel/threads-max/proc/sys/vm/max_map_count (默認為65K)。

上面提到的應用程序最初設計為僅處理2K並發連接。 但是,隨着使用的增長,我們不必對代碼進行重大更改,以便擴展到50K連接。

您可能希望最近關於這個主題的后續行動: 1000萬個並發連接的秘密 - 內核是問題,而不是解決方案

服務器的常用方法是:(a)每個連接的線程(通常使用線程池),或(b)使用異步IO的單線程(通常使用epoll或kqueue)。 我的想法是,這些方法的一些元素可以並且經常應該組合使用異步IO(使用epoll或kqueue),然后將連接請求移交給線程池進行處理。 這種方法將異步IO的有效分派與線程池提供的並行性結合起來。

我編寫了這樣一個有趣的服務器(在C ++中),它在Linux上使用epoll,在FreeBSD和OSX上使用kqueue以及線程池。 我只需要通過它的步驟進行繁重的測試,做一些代碼清理,然后把它扔到github上(希望很快)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM