Linux下TCP最大連接數受限問題

一、 文件數限制修改
1、用戶級別
查看Linux系統用戶最大打開文件限制:
# ulimit -n
1024

(1) vi /etc/security/limits.conf
* soft nofile 10240
* hard nofile 10240
其中mysql指定了要修改哪個用戶的打開文件數限制。
可用'*'號表示修改所有用戶的限制;soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即最大打開文件數(請注意軟限制值要小於或等於硬限制)。

(2) vi /etc/pam.d/login
session required /lib/security/pam_limits.so
這是告訴Linux在用戶完成系統登錄後,應該調用pam_limits.so模塊來設置系統對該用戶可使用的各種資源數量的最大限制(包括用戶可打開的最大文件數限制)。
而pam_limits.so模塊就會從/etc/security/limits.conf文件中讀取配置來設置這些限制值。

2、Linux系統級別
查看Linux系統對同時打開文件數的硬限制:
# sysctl -a|grep file-max
fs.file-max = 65535
這表明這臺Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)65535個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制都不會超過這個數值。
通常這個系統級硬限制是Linux系統在啓動時根據系統硬件資源狀況計算出來的最佳的最大同時打開文件數限制。

(1) vi /etc/sysctl.conf
fs.file-max = 1000000
立即生效:
# sysctl -p

二、 網絡端口限制修改
查看Linux系統最大追蹤TCP連接數量:
# sysctl -a | grep ipv4.ip_conntrack_max
net.ipv4.ip_conntrack_max = 20000
這表明系統將對最大跟蹤的TCP連接數限制默認爲20000。

查看Linux系統端口範圍:
# sysctl -a | grep ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 1024 30000
注意:
每個TCP客戶端連接都要佔用一個唯一的本地端口號(此端口號在系統的本地端口號範圍限制中),如果現有的TCP客戶端連接已將所有的本地端口號佔滿。將不能創建新的TCP連接。

(1) vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024    65535
net.ipv4.ip_conntrack_max = 20000
如果按上述端口範圍進行設置,則理論上單獨一個進程最多可以同時建立60000多個TCP客戶端連接。
如果按上述參數進行設置,則理論上單獨一個進程最多可以同時建立20000多個TCP客戶端連接。


備註:
對用戶可同時打開文件數設置爲10240個;
將Linux系統可同時打開文件數設置爲1000000個(一定要大於對用戶的同時打開文件數限制);
將Linux系統對最大追蹤的TCP連接數限制爲20000個(但是,建議設置爲10240;因爲對mysql用戶的同時打開文件數已經限制在10240個;且較小的值可以節省內存);
將linux系統端口範圍配置爲1024~30000(可以支持60000個以上連接,不建議修改;默認已經支持20000個以上連接);

綜合上述四點,TCP連接數限制在10140個。
這10240個文件中還得除去每個進程必然打開的標準輸入,標準輸出,標準錯誤,服務器監聽 socket,進程間通訊的unix域socket等文件。


因此,當需要對TCP連接數進行調整時只需要調整ulimit參數。

補:1、epoll、libevent、listen參數均不會對此有限制,不必考慮。

       2、如果程序是開機自啓的話,一定要注意順序,應當在這些配置生效之後再啓動,否則對該程序不起作用。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章