本文來自微信公眾號:開發(fā)內功修煉 (ID:kfngxl),作者:張彥飛 allen
困惑很多人的并發(fā)問題
在網(wǎng)絡開發(fā)中,我發(fā)現(xiàn)有很多同學對一個基礎問題始終是沒有徹底搞明白。那就是一臺服務器最大究竟能支持多少個網(wǎng)絡連接?我想我有必要單獨發(fā)一篇文章來好好說一下這個問題。
很多同學看到這個問題的第一反應是 65535。原因是:“聽說端口號最多有 65535 個,那長連接就最多保持 65535 個了”。是這樣的嗎?還有的人說:“應該受 TCP 連接里四元組的空間大小限制,算起來是 200 多萬億個!”
如果你對這個問題也是理解的不夠徹底,那么今天講個故事講給你聽!
一次關于服務器端并發(fā)的聊天
"TCP 連接四元組是源 IP 地址、源端口、目的 IP 地址和目的端口。任意一個元素發(fā)生了改變,那么就代表的是一條完全不同的連接了。拿我的 Nginx 舉例,它的端口是固定使用 80。另外我的 IP 也是固定的,這樣目的 IP 地址、目的端口都是固定的。剩下源 IP 地址、源端口是可變的。所以理論上我的 Nginx 上最多可以建立 2 的 32 次方(ip 數(shù))×2 的 16 次方(port 數(shù))個連接。這是兩百多萬億的一個大數(shù)字!!"
"進程每打開一個文件(linux 下一切皆文件,包括 socket),都會消耗一定的內存資源。如果有不懷好心的人啟動一個進程來無限的創(chuàng)建和打開新的文件,會讓服務器崩潰。所以 linux 系統(tǒng)出于安全角度的考慮,在多個位置都限制了可打開的文件描述符的數(shù)量,包括系統(tǒng)級、用戶級、進程級。這三個限制的含義和修改方式如下:"
系統(tǒng)級:當前系統(tǒng)可打開的最大數(shù)量,通過 fs.file-max 參數(shù)可修改
用戶級:指定用戶可打開的最大數(shù)量,修改 / etc / security / limits.conf
進程級:單個進程可打開的最大數(shù)量,通過 fs.nr_open 參數(shù)可修改
"我的接收緩存區(qū)大小是可以配置的,通過 sysctl 命令就可以查看。"
$ sysctl -a | grep rmem net.ipv4.tcp_rmem = 4096 87380 8388608 net.core.rmem_default = 212992 net.core.rmem_max = 8388608
"其中在 tcp_rmem" 中的第一個值是為你們的 TCP 連接所需分配的最少字節(jié)數(shù)。該值默認是 4K,最大的話 8MB 之多。也就是說你們有數(shù)據(jù)發(fā)送的時候我需要至少為對應的 socket 再分配 4K 內存,甚至可能更大。"
"TCP 分配發(fā)送緩存區(qū)的大小受參數(shù) net.ipv4.tcp_wmem 配置影響。"
$ sysctl -a | grep wmem net.ipv4.tcp_wmem = 4096 65536 8388608 net.core.wmem_default = 212992 net.core.wmem_max = 8388608
"在 net.ipv4.tcp_wmem" 中的第一個值是發(fā)送緩存區(qū)的最小值,默認也是 4K。當然了如果數(shù)據(jù)很大的話,該緩存區(qū)實際分配的也會比默認值大。"
服務端百萬連接達成記
“準備啥呢,還記得前面說過 Linux 對最大文件對象數(shù)量有限制,所以要想完成這個實驗,得在用戶級、系統(tǒng)級、進程級等位置把這個上限加大。我們實驗目的是 100W,這里都設置成 110W,這個很重要!因為得保證做實驗的時候其它基礎命令例如 ps,vi 等是可用的。“
活動連接數(shù)量確實達到了 100W:
$ ss -n | grep ESTAB | wc -l 1000024
當前機器內存總共是 3.9GB,其中內核 Slab 占用了 3.2GB 之多。MemFree 和 Buffers 加起來也只剩下 100 多 MB 了:
$ cat /proc/meminfo MemTotal: 3922956 kB MemFree: 96652 kB MemAvailable: 6448 kB Buffers: 44396 kB Slab: 3241244KB kB
通過 slabtop 命令可以查看到 densty、flip、sock_inode_cache、TCP 四個內核對象都分別有 100W 個:
結語
互聯(lián)網(wǎng)后端的業(yè)務特點之一就是高并發(fā).但是一臺服務器最大究竟能支持多少個 TCP 連接,這個問題似乎卻又在困惑著很多同學。希望今天過后,你能夠將這個問題踩在腳下摩擦!
學習是一件痛苦的事情,尤其咱們號里很多讀者朋友都是工作滿一天了再來看我的技術號的文章的。我一直都在琢磨到底怎么樣組織技術內容形式,能讓大家理解起來更能省一點腦細胞呢。這篇服務器的最大并發(fā)數(shù)的文章是早就想發(fā)的,但是寫了兩三個版本都不滿意。今天終于想出了一種讓大家更容易理解的方式,算過了自己這關了。
廣告聲明:文內含有的對外跳轉鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時間,結果僅供參考,IT之家所有文章均包含本聲明。