[英]TCP/IP - Solving the C10K with the thread per client approach
在閱讀着名的C10k文章並在網上搜索自編寫之后事情如何演變之后,我想知道今天的標准服務器是否有可能使用每個連接的線程處理> 10000個並發 連接 (可能與一個線程池的幫助,以避免創建/終止進程)。
一些可能影響問題解決方法的細節:
顯然我不是這方面的專家,所以任何評論或建議都將受到高度贊賞:)
絕對。 標准服務器可以使用每個連接一個線程的模型處理超過10K的並發 連接 。 我已經構建了這樣一個應用程序,五年前,它在標准Linux服務器上運行時每個進程的並發連接數超過50K。 如今,應該可以在當前硬件上運行具有超過250K並發連接的相同應用程序。
要記住的只有幾件事:
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.