天天看點

一台伺服器能支撐多少個TCP連接配接

1. 困惑很多人的并發問題

在網絡開發中,我發現有很多同學對一個基礎問題始終是沒有徹底搞明白。那就是一台伺服器最大究竟能支援多少個網絡連接配接?我想我有必要單獨發一篇文章來好好說一下這個問題。

  很多同學看到這個問題的第一反應是65535。原因是:"聽說端口号最多有65535個,那長連接配接就最多保持65535個了"。是這樣的嗎?還有的人說:"應該受TCP連接配接裡四元組的空間大小限制,算起來是200多萬億個!"

  如果你對這個問題也是了解的不夠徹底,那麼今天講個故事講給你聽!

2. 一次關于伺服器端并發的聊天

一台伺服器能支撐多少個TCP連接配接

"程序每打開一個檔案(linux下一切皆檔案,包括socket),都會消耗一定的記憶體資源。如果有不懷好心的人啟動一個程序來無限的建立和打開新的檔案,會讓伺服器崩潰。是以linux系統出于安全角度的考慮,在多個位置都限制了可打開的檔案描述符的數量,包括系統級、使用者級、程序級。這三個限制的含義和修改方式如下:"

  • 系統級:目前系統可打開的最大數量,通過fs.file-max參數可修改
  • 使用者級:指定使用者可打開的最大數量,修改/etc/security/limits.conf
  • 程序級:單個程序可打開的最大數量,通過fs.nr_open參數可修改
一台伺服器能支撐多少個TCP連接配接

 "我的接收緩存區大小是可以配置的,通過sysctl指令就可以檢視。"

一台伺服器能支撐多少個TCP連接配接

"其中在tcp_rmem"中的第一個值是為你們的TCP連接配接所需配置設定的最少位元組數。該值預設是4K,最大的話8MB之多。也就是說你們有資料發送的時候我需要至少為對應的socket再配置設定4K記憶體,甚至可能更大。"

一台伺服器能支撐多少個TCP連接配接

3. 服務端百萬連接配接達成記

一台伺服器能支撐多少個TCP連接配接

"準備啥呢,還記得前面說過Linux對最大檔案對象數量有限制,是以要想完成這個實驗,得在使用者級、系統級、程序級等位置把這個上限加大。我們實驗目的是100W,這裡都設定成110W,這個很重要!因為得保證做實驗的時候其它基礎指令例如ps,vi等是可用的。"

一台伺服器能支撐多少個TCP連接配接
一台伺服器能支撐多少個TCP連接配接

 活動連接配接數量确實達到了100W:

一台伺服器能支撐多少個TCP連接配接

 目前機器記憶體總共是3.9GB,其中核心Slab占用了3.2GB之多。MemFree和Buffers加起來也隻剩下100多MB了:

一台伺服器能支撐多少個TCP連接配接

  通過slabtop指令可以檢視到densty、flip、sock_inode_cache、TCP四個核心對象都分别有100W個:

一台伺服器能支撐多少個TCP連接配接
一台伺服器能支撐多少個TCP連接配接

4. 總結

  網際網路後端的業務特點之一就是高并發. 但是一台伺服器最大究竟能支援多少個TCP連接配接,這個問題似乎卻又在困惑着很多同學。希望今天過後,你能夠将這個問題踩在腳下摩擦!

轉載微信開發内功修煉

作者:​​小家電維修​​

轉世燕還故榻,為你銜來二月的花。

繼續閱讀