如何在單台伺服器上實現百萬級長連線,以下是實現該目標進行的一些優化:
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 2000000admin 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...