參考大佬文章:
- 一臺(tái)機(jī)器最多能撐多少個(gè)TCP連接? 今天掰扯清楚!
這個(gè)問(wèn)題要分場(chǎng)景,先說(shuō)下結(jié)論:
- 客戶端:最多支持TCP連接數(shù) = IP數(shù) * 端口數(shù) = IP數(shù) * 65535,其中的IP數(shù)是由于linux下可以配置多IP
- 服務(wù)端:取決于linux服務(wù)器的內(nèi)存大小,內(nèi)存數(shù) / 靜默TCP連接所占大小 3.3k,若linux服務(wù)器有4GB的內(nèi)存,那么最終理論值為:4GB / 3.3k ≈ 127w個(gè) 連接。(如果有數(shù)據(jù)發(fā)送,需要為每條TCP分配發(fā)送緩存區(qū),大小受你的參數(shù)
net.ipv4.tcp_wmem
配置影響,默認(rèn)情況下最小是4K)
此外,Socket 實(shí)際上是一個(gè)文件,也就會(huì)對(duì)應(yīng)一個(gè)文件描述符。因此,還取決于linux系統(tǒng)對(duì)單個(gè)進(jìn)程打開(kāi)的文件描述符的限制(默認(rèn)1024),可以通過(guò)ulimit
增大文件描述符的數(shù)目。
客戶端
對(duì)于僅有一個(gè)IP的客戶端來(lái)說(shuō),最多能支持的連接數(shù)受限于端口 ip_local_port_range
參數(shù),一般為65535。但是由于linux環(huán)境下是能配置多IP的,所以理論值:最多支持TCP連接數(shù) = IP數(shù) * 端口數(shù) = IP數(shù) * 65535
服務(wù)端
服務(wù)端不同于客戶端,最大連接數(shù)并不僅僅受限于端口數(shù)。否則Nginx服務(wù)器只監(jiān)聽(tīng)了一個(gè)80端口,那豈不是最多只能支持一個(gè)TCP連接了?顯然絕不可能。
一個(gè)TCP連接是由一個(gè)【四元組:源IP、源端口、目標(biāo)IP、目標(biāo)端口】來(lái)唯一確定的。
在不考慮地址重用(socket中的 SO_REUSEADDR
端口復(fù)用選項(xiàng))的情況下,例如:對(duì)只監(jiān)聽(tīng)80端口Nginx服務(wù)器來(lái)說(shuō),服務(wù)器IP和端口是固定的,因此四元組中僅有 客戶端IP、客戶端端口 是可變的。所以服務(wù)端能建立的TCP連接數(shù)是:客戶端IP數(shù) * 客戶端端口數(shù) = 232 * 21?。
然而linux上不僅僅只能監(jiān)聽(tīng)80端口,還可以監(jiān)聽(tīng)其他端口號(hào),比如:MySQL-3306,Redis-6379,一共有21?=65535個(gè)端口,因此服務(wù)器理論上最多可以支持的TCP連接數(shù)為:客戶端IP數(shù) * 客戶端端口數(shù) * 服務(wù)端監(jiān)聽(tīng)端口數(shù) = 232 * 21? * 21?,這個(gè)理論上的結(jié)果值幾乎可以認(rèn)為是無(wú)限大。
其中客戶端IP數(shù)為何是 232 ?
因?yàn)?2位長(zhǎng)度的IPv4地址,共有 232個(gè)地址,范圍是:00000000,00000000,00000000,00000000(十進(jìn)制表示為0)—— 11111111,11111111,11111111,11111111(十進(jìn)制表示為232-1,4個(gè)2? 拼接為232)
而端口數(shù)默認(rèn)為65535個(gè),即 21? 個(gè)
不過(guò)理論和實(shí)際是有差距的,因?yàn)閘inux每維護(hù)一條TCP連接都要消耗資源(處理連接請(qǐng)求、保活、數(shù)據(jù)收發(fā)都需消耗CPU,而維持TCP連接又要消耗內(nèi)存)。這里我們先不考慮數(shù)據(jù)的收發(fā),只考慮靜止?fàn)顟B(tài)下的TCP連接,此狀態(tài)下對(duì)CPU的消耗可以忽略不計(jì),主要考慮內(nèi)存的影響即可。
一條TCP連接如果不考慮收發(fā)數(shù)據(jù)的話,占用的內(nèi)存大概是3.3k(如果有數(shù)據(jù)收發(fā),就需要另外為每條TCP分配發(fā)送緩沖區(qū),其大小受參數(shù) net.ipv4.tcp_wmem
的配置影響,初始默認(rèn)為4k。如果收發(fā)結(jié)束。緩沖區(qū)所占的內(nèi)存才會(huì)被回收)。
然而我們linux服務(wù)器的內(nèi)存是有限的,假設(shè)只保持連接不收發(fā)數(shù)據(jù),那么服務(wù)器可以建立的最大連接數(shù)是:內(nèi)存數(shù) / 靜默TCP連接所占大小 3.3k。假設(shè)你的linux服務(wù)器有4GB的內(nèi)存,那么最終理論值為:4GB / 3.3k ≈ 127w條 連接。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-489208.html
所以最終結(jié)論:
每一個(gè)監(jiān)聽(tīng)的端口雖然理論值很大,但是這個(gè)數(shù)字沒(méi)有實(shí)際意義,不現(xiàn)實(shí)。服務(wù)器最多能支持的TCP連接數(shù)最終要取決于linux服務(wù)器的內(nèi)存大小。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-489208.html
到了這里,關(guān)于一臺(tái)linux服務(wù)器最多能支持多少個(gè)TCP連接?(要區(qū)分客戶端還是服務(wù)端)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!