在效能測試過程中,經常會接觸到鏈結數相關的問題,有乙個問題曾經困擾我好長時間,那就是一台伺服器最多能支援多少鏈結數呢?
有的朋友可能會說是65535,因為作業系統有65535個埠,那麼這個答案準確嗎?
這四個要素唯一確定乙個tcp鏈結,任意乙個要素不相同,就認為是乙個不同的鏈結。
「can't open so many files"
通過命令ulimit -n可以檢視當前系統允許開啟檔案數量的上限,在linux中這個值預設是1024,也就是說預設情況下,只能建立1024個鏈結。同時這個值也是可以修改的,通過修改/etc/security/limits.conf檔案,可以把這個值改大,一般伺服器都會改的很大,比如我們的伺服器上一般設定為1000000。
那這麼說是不是就意味著只要我改的很大,鏈結數可以無限大了?
其實也並不是這樣,建立鏈結的時候,一般分為兩個端,即鏈結的發起端和鏈結接收端。比如我們現在使用jmeter進行壓測,被測系統部署在tomcat伺服器10.0.0.3上,使用的是8080埠。如果我們用5個併發來進行壓測的話,建立的鏈結如下圖所示
鏈結發起端
對於jmeter來說,它是鏈結發起端,jmeter建立了5個鏈結去連線服務端的8080埠,每個新建鏈結會占用了乙個埠號,如圖中的10001-10005。在作業系統中,埠號的範圍是0-65535,其中0-1024是預留埠號,不可使用,其他的埠都是可以使用的。也就是說,在鏈結發起端,受埠號的限制理論上最多可以建立64000左右鏈結。
那麼有沒有辦法超過這個限制呢,答案是肯定的!
通過tcp標識的四元組可以看到,對於鏈結發起端,影響鏈結數的是本地ip和port,埠號受限於65535,已經沒辦法增加了。那我們可以增加本地ip來達到這個目的。一般情況下,伺服器的乙個網絡卡上只繫結了乙個ip,對外通訊都使用這個ip進行。其實網絡卡是支援乙個繫結多個ip的(必須確保ip是有效的且未使用的)
ifconfig eth0:1 10.0.0.5
以上命令可以在eth0網絡卡上增加乙個ip 10.0.0.5,伺服器網絡卡每增加乙個ip,就可以允許在這個ip上再建立65535左右的鏈結數。
我曾經做過乙個郵件閘道器的鏈結數測試,目的是為了測試閘道器伺服器可以接收並且保持多少tcp長連線。正常情況下,受限於單台機器65535埠號的影響,客戶端想建立25萬tcp長連線,至少需要4臺機器。通過對客戶端網絡卡繫結多ip的方法,成功在一台機器上建立了25萬個鏈結。
當然,這種手段只是一種非常規的操作,只是為了進行某種特殊場景的測試。正常情況下不推薦網絡卡繫結多個ip。
鏈結接收端
對於tomcat伺服器來講,它是鏈結接收端,它是不是也受限於65535呢?並不是,從上面圖中可以看到,jmeter發起的所有鏈結都建立在tomcat伺服器的8080埠,也就是說對於鏈結接收端,所有的鏈結占用的是同乙個埠。根據tcp標識四元組可以分析出,乙個鏈結接收端,最大的tcp鏈結數=所有有效ip排列組合的數量*埠數量64000,這個計算結果應該是乙個天文數字(我數學不好就不計算了,差不多相當於我一年的工資總和)。因此鏈結接收端支援的鏈結數理論上可以認為是無限大的。
上面介紹的一些資料都是理論上單台機器可以支援的tcp鏈結數,實際情況下,每建立乙個鏈結需要消耗一定的記憶體,大概是4-10kb,所以鏈結數也受限於機器的總記憶體。(鏈結發起端,活力全開才64000左右鏈結,記憶體最多才占用640m,一般客戶端都能 滿足;記憶體限制主要還是考慮伺服器端)
單台伺服器最大支援多少連線數
在效能測試過程中,經常會接觸到鏈結數相關的問題,有乙個問題曾經困擾我好長時間,那就是一台伺服器最多能支援多少鏈結數呢?有的朋友可能會說是65535,因為作業系統有65535個埠,那麼這個答案準確嗎?這四個要素唯一確定乙個tcp鏈結,任意乙個要素不相同,就認為是乙個不同的鏈結。can t open s...
伺服器最大連線數問題
伺服器程序會有乙個最大連線數,如果達到最大連線數,server端報錯 listener accept fail accept tcp 6080 accept4 too many open files 此時,client端報錯 dial tcp 172.20.152.87 6080 i o timeo...
linux伺服器支援的TCP連線數
結論 和伺服器的記憶體大小,伺服器的記憶體分配設定,tcp連線傳輸的資料量 等有關 nginx的埠可能指定的是80埠,目標ip是伺服器本身,所以源ip和源埠是可變的 linux中一切皆檔案,所以tcp連線 socket 也會建立檔案 記憶體檔案 不會建立在磁碟上,或者說是乙個檔案識別符號 file ...