標籤:

現在 epoll 單機(4G內存)並發量最大能達到多少?


按照題主的意思 是根據內存去算一個最大並發的連接數. 那麼首先要找出來單個連接消耗內存的地方.

第一個首先是socket buffer. read 和write 分別有一個, 默認大小在

  • /proc/sys/net/ipv4/tcp_rmem (for read)
  • /proc/sys/net/ipv4/tcp_wmem (for write)

默認大小都是87K和16K, 最低是4K和4K, 最高是2M,2M, 實際使用默認值最低也要保留8K,8K.

然後是邏輯IO緩衝區

就是比如你監聽了recv事件 事件來了 你要有內存可用(一般都是socket建立起就分配好,斷開才會釋放的).

這個內存是自己寫socket程序時候自己控制的, 最低也要4K,4K, 實際使用8K,8K至少.

現在設定一個優化方案和使用場景, 首先假設4G內存全部為空閑(系統和其他進程也要內存的....

假如網路包的大小都可以控制在4K以下, 假設所有連接的網路都不會擁堵, 或者擁堵時候的總量在4K以下:

一個連接的內存消耗是4+4+4+4=16K

4G/16K=26.2萬並發

假如網路包的大小都可以控制在8K以下, 假設所有連接的網路都不會擁堵, 或者擁堵時候的總量在8K以下

一個socket的內存佔用介於 24K ~ 32K之間, 保守的按照32K算

4G/32K=13.1萬並發, 這個在生產環境作為一個純網路層面的內存消耗, 是可以作為參考的.

假如使用默認配置, 假如所有連接的網路都出現嚴重擁堵, 不考慮邏輯上的發送隊列的佔用,

使用默認配置是2M+2M+8+8 ~= 4M

4G/4M=1024並發 ( ...

如果考慮到發送隊列也擁堵的話 自己腦補.

如果只是為了跑分 為了並發而優化, 沒有常駐的邏輯緩衝區 並且socket的網路吞吐量很小並且負載平滑, 把socket buffer size設置系統最低.

那麼是

4G/8K = 52.4萬並發 這個應該是極限值了.


貌似樓上都錯了吧???

我們設計一個最簡模型,假設內存速度無限快,cpu無限強, 處理會話的時間開銷為0,那麼我們算一下:記錄一個會話需要5元組,再增加一個標誌位(8bit),消耗內存總共16byte(考慮內存4位元組對齊)。那麼並發多少就可以耗盡內存了呢(假設4G內存全部給這個模型用,沒有共享內存和內核的消耗。)?

4*1024*1024*1024/16=268,435,456。不可思議?只有內存容量,不考慮內存的性能(分配內存的開銷,內存拷貝的開銷),cpu的性能(中斷的響應速度),網卡的性能(收包發包的延遲,註:這裡指的是電信號和光信號的傳輸速度,解碼速度。)的情況下,這個問題是無解的。


樓上答的不錯了,記得這個好像是百度的面試題,在群里有人問過,當時關注了下,題主可以man下epoll就明白樓上的解釋了


推薦閱讀:

使用epoll時需要將socket設為非阻塞嗎?
epoll實現中共享內存問題?
大神們來看看這樣架構 使用epoll有沒有問題?
Linux 3.x 中epoll的驚群問題?
node.js 底層使用的是epoll這種單線程io多路復用,還是多線程阻塞模型?

TAG:epoll |