【導(dǎo)讀】:單臺 Linux 服務(wù)器可以支撐多少個 TCP 連接?關(guān)于這個問題,我想很多客戶端的同學(xué)都不怎么了解,甚至于很多服務(wù)器開發(fā)也沒有特意的關(guān)注。
那么這個承載數(shù)到底取決了什么,是端口數(shù)量,還是內(nèi)存大小,亦或者是可創(chuàng)建文件句柄數(shù)量?讓我們一起來了解下吧。
困惑很多人的并發(fā)問題
在網(wǎng)絡(luò)開發(fā)中,我發(fā)現(xiàn)有很多同學(xué)對一個基礎(chǔ)問題始終是沒有徹底搞明白。那就是一臺服務(wù)器最大究竟能支持多少個網(wǎng)絡(luò)連接?我想我有必要單獨發(fā)一篇文章來好好說一下這個問題。
很多同學(xué)看到這個問題的第一反應(yīng)是65535。原因是:“聽說端口號最多有65535個,那長連接就最多保持65535個了”。是這樣的嗎?還有的人說:“應(yīng)該受TCP連接里四元組的空間大小限制,算起來是200多萬億個!”
如果你對這個問題也是理解的不夠徹底,那么今天講個故事講給你聽!
一次關(guān)于服務(wù)器端并發(fā)的聊天
"TCP連接四元組是源IP地址、源端口、目的IP地址和目的端口。任意一個元素發(fā)生了改變,那么就代表的是一條完全不同的連接了。拿我的Nginx舉例,它的端口是固定使用80。另外我的IP也是固定的,這樣目的IP地址、目的端口都是固定的。剩下源IP地址、源端口是可變的。所以理論上我的Nginx上最多可以建立2的32次方(ip數(shù))×2的16次方(port數(shù))個連接。這是兩百多萬億的一個大數(shù)字??!"
"進(jìn)程每打開一個文件(linux下一切皆文件,包括socket),都會消耗一定的內(nèi)存資源。如果有不懷好心的人啟動一個進(jìn)程來無限的創(chuàng)建和打開新的文件,會讓服務(wù)器崩潰。所以linux系統(tǒng)出于安全角度的考慮,在多個位置都限制了可打開的文件描述符的數(shù)量,包括系統(tǒng)級、用戶級、進(jìn)程級。這三個限制的含義和修改方式如下:"
系統(tǒng)級:當(dāng)前系統(tǒng)可打開的最大數(shù)量,通過fs.file-max參數(shù)可修改
用戶級:指定用戶可打開的最大數(shù)量,修改/etc/security/limits.conf
進(jìn)程級:單個進(jìn)程可打開的最大數(shù)量,通過fs.nr_open參數(shù)可修改
"我的接收緩存區(qū)大小是可以配置的,通過sysctl命令就可以查看。"
$sysctl-a|greprmem net.ipv4.tcp_rmem=4096873808388608 net.core.rmem_default=212992 net.core.rmem_max=8388608
"其中在tcp_rmem"中的第一個值是為你們的TCP連接所需分配的最少字節(jié)數(shù)。該值默認(rèn)是4K,最大的話8MB之多。也就是說你們有數(shù)據(jù)發(fā)送的時候我需要至少為對應(yīng)的socket再分配4K內(nèi)存,甚至可能更大。"
"TCP分配發(fā)送緩存區(qū)的大小受參數(shù)net.ipv4.tcp_wmem配置影響。"
$sysctl-a|grepwmem net.ipv4.tcp_wmem=4096655368388608 net.core.wmem_default=212992 net.core.wmem_max=8388608
"在net.ipv4.tcp_wmem"中的第一個值是發(fā)送緩存區(qū)的最小值,默認(rèn)也是4K。當(dāng)然了如果數(shù)據(jù)很大的話,該緩存區(qū)實際分配的也會比默認(rèn)值大。"
服務(wù)端百萬連接達(dá)成記
“準(zhǔn)備啥呢,還記得前面說過Linux對最大文件對象數(shù)量有限制,所以要想完成這個實驗,得在用戶級、系統(tǒng)級、進(jìn)程級等位置把這個上限加大。我們實驗?zāi)康氖?00W,這里都設(shè)置成110W,這個很重要!因為得保證做實驗的時候其它基礎(chǔ)命令例如ps,vi等是可用的。“
活動連接數(shù)量確實達(dá)到了100W:
$ss-n|grepESTAB|wc-l 1000024
當(dāng)前機器內(nèi)存總共是3.9GB,其中內(nèi)核Slab占用了3.2GB之多。MemFree和Buffers加起來也只剩下100多MB了:
$cat/proc/meminfo MemTotal:3922956kB MemFree:96652kB MemAvailable:6448kB Buffers:44396kB ...... Slab:3241244KBkB
通過slabtop命令可以查看到densty、flip、sock_inode_cache、TCP四個內(nèi)核對象都分別有100W個:
結(jié)語
互聯(lián)網(wǎng)后端的業(yè)務(wù)特點之一就是高并發(fā). 但是一臺服務(wù)器最大究竟能支持多少個TCP連接,這個問題似乎卻又在困惑著很多同學(xué)。希望今天過后,你能夠?qū)⑦@個問題踩在腳下摩擦!
原文標(biāo)題:漫畫:一臺 Linux 服務(wù)器最多能支撐多少個 TCP 連接
文章出處:【微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
互聯(lián)網(wǎng)
+關(guān)注
關(guān)注
54文章
11074瀏覽量
102618 -
Linux
+關(guān)注
關(guān)注
87文章
11212瀏覽量
208721 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
8963瀏覽量
85087
原文標(biāo)題:漫畫:一臺 Linux 服務(wù)器最多能支撐多少個 TCP 連接
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論