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


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

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

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

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

 

2. 一次關於服務器端並發的聊天

  "進程每打開一個文件(linux下一切皆文件,包括socket),都會消耗一定的內存資源。如果有不懷好心的人啟動一個進程來無限的創建和打開新的文件,會讓服務器崩潰。所以linux系統出於安全角度的考慮,在多個位置都限制了可打開的文件描述符的數量,包括系統級、用戶級、進程級。這三個限制的含義和修改方式如下:"

    • 系統級:當前系統可打開的最大數量,通過fs.file-max參數可修改
    • 用戶級:指定用戶可打開的最大數量,修改/etc/security/limits.conf
    • 進程級:單個進程可打開的最大數量,通過fs.nr_open參數可修改

  "我的接收緩存區大小是可以配置的,通過sysctl命令就可以查看。"

  "其中在tcp_rmem"中的第一個值是為你們的TCP連接所需分配的最少字節數。該值默認是4K,最大的話8MB之多。也就是說你們有數據發送的時候我需要至少為對應的socket再分配4K內存,甚至可能更大。"

 

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

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

 

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

  當前機器內存總共是3.9GB,其中內核Slab占用了3.2GB之多。MemFree和Buffers加起來也只剩下100多MB了:

  通過slabtop命令可以查看到densty、flip、sock_inode_cache、TCP四個內核對象都分別有100W個:

 

4. 總結

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

 

 

轉載微信開發內功修煉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM