優化 單台伺服器支援百萬級別tcp長連線

2021-08-20 01:49:57 字數 1650 閱讀 3438

如何在單台伺服器上實現百萬級長連線,以下是實現該目標進行的一些優化:

1.首先需要準備一台大記憶體的伺服器,裝上linux系統,比如rehat、centos(核心版本在2.6.25之上)等。

為什麼需要大記憶體,因為每個連線都需要有讀寫快取,具體看第二部內容;

為什麼核心版本要在2.6.25之上,因為2.6.25核心之前有個 巨集定義,定義了最大檔案描述符大小為1024*1024,正好是100萬。可以通過/proc/sys/fs /nr_open來設定該值。

2.裝好系統後,調整一下系統的引數,在/etc/

sysctl

.conf中

#定義了系統中每乙個埠最大的監聽佇列的長度,這是個全域性的引數,預設值為128

net.core.somaxconn = 2048  

#系統讀寫快取,預設值

net.core.rmem_default = 262144  

net.core.wmem_default = 262144  

#系統讀寫快取

net.core.rmem_max = 16777216  

net.core.wmem_max = 16777216  

net.ipv4.tcp_rmem = 4096 4096 16777216  

net.ipv4.tcp_wmem = 4096 4096 16777216  

net.ipv4.tcp_mem = 786432 3145728  4194304

net.ipv4.tcp_max_syn_backlog = 16384  

net.core.netdev_max_backlog = 20000  

net.ipv4.tcp_fin_timeout = 15  

net.ipv4.tcp_max_syn_backlog = 16384  

net.ipv4.tcp_tw_reuse = 1  

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_rmem用來配置tcp讀緩衝的大小,第乙個4096是這個讀緩衝的最小值,第三個是最大值,中間的是預設值。zhe在程式中修改讀緩衝的大小,但不能超過最小與最大。為了使每個socket所使用的記憶體數最小,我這裡設定預設值為4096。

net.ipv4.tcp_wmem用來配置寫緩衝的大小。讀緩衝與寫緩衝在大小,直接影響到socket在核心中記憶體的占用,這就是第一條裡說的為什麼需要大記憶體。

而net.ipv4.tcp_mem則是配置tcp的記憶體大小,其單位是頁,而不是位元組。當超過第二個值時,tcp進入 pressure模式,此時tcp嘗試穩定其記憶體的使用,當小於第乙個值時,就退出pressure模式。當記憶體占用超過第三個值時,tcp就拒絕分配 socket了,檢視dmesg

,會打出很多的日誌「tcp: too many of orphaned sockets」。

另外,服務端需要開啟大量的檔案描述符,比如200萬個,配置如下:

設定nofile為200萬(2.6.25核心及其之後版本),這個值是可以通過/proc/sys/fs /nr_open來設定。

現在再設定nofile就可以了:

admin    soft    nofile  2000000  

admin hard nofile 2000000

單台伺服器最大支援多少連線數

在效能測試過程中,經常會接觸到鏈結數相關的問題,有乙個問題曾經困擾我好長時間,那就是一台伺服器最多能支援多少鏈結數呢?有的朋友可能會說是65535,因為作業系統有65535個埠,那麼這個答案準確嗎?這四個要素唯一確定乙個tcp鏈結,任意乙個要素不相同,就認為是乙個不同的鏈結。can t open s...

單台伺服器最大支援多少連線數

在效能測試過程中,經常會接觸到鏈結數相關的問題,有乙個問題曾經困擾我好長時間,那就是一台伺服器最多能支援多少鏈結數呢?有的朋友可能會說是65535,因為作業系統有65535個埠,那麼這個答案準確嗎?這四個要素唯一確定乙個tcp鏈結,任意乙個要素不相同,就認為是乙個不同的鏈結。can t open s...

使用完成埠的單台伺服器最多可連線2500個客戶端

typedef struct per handle data,lpper handle data dword stdcall serverworkerthread lpvoid pletionportid void main void if pletionport createio pletionp...