常識一:文件句柄限制
-
進程限制
-
執行 ulimit -n 輸出 1024,說明對於一個進程而言最多隻能打開1024個文件,所以你要採用此默認配置最多也就可以併發上千個TCP連接。
-
臨時修改:ulimit -n 1000000,但是這種臨時修改只對當前登錄用戶目前的使用環境有效,系統重啓或用戶退出後就會失效。
-
重啓後失效的修改(不過我在CentOS 6.5下測試,重啓後未發現失效):編輯 /etc/security/limits.conf 文件, 修改後內容爲
* soft nofile 1000000
* hard nofile 1000000
-
永久修改:編輯/etc/rc.local,在其後添加如下內容
ulimit -SHn 1000000
-
-
全侷限制
-
執行 cat /proc/sys/fs/file-nr 輸出
9344 0 592026
,分別爲:1.已經分配的文件句柄數,2.已經分配但沒有使用的文件句柄數,3.最大文件句柄數。但在kernel 2.6版本中第二項的值總爲0,這並不是一個錯誤,它實際上意味着已經分配的文件描述符無一浪費的都已經被使用了 。 -
我們可以把這個數值改大些,用 root 權限修改 /etc/sysctl.conf 文件:
fs.file-max = 1000000
net.ipv4.ip_conntrack_max = 1000000
net.ipv4.netfilter.ip_conntrack_max = 1000000
-
常識二:端口號範圍限制?
-
如何標識一個TCP連接:系統用一個4四元組來唯一標識一個TCP連接:{local ip, local port,remote ip,remote port}。好吧,我們拿出《UNIX網絡編程:卷一》第四章中對accept的講解來看看概念性的東西,第二個參數cliaddr代表了客戶端的ip地址和端口號。而我們作爲服務端實際只使用了bind時這一個端口,說明端口號65535並不是併發量的限制。
-
server最大tcp連接數:server通常固定在某個本地端口上監聽,等待client的連接請求。不考慮地址重用(unix的SO_REUSEADDR選項)的情況下,即使server端有多個ip,本地監聽端口也是獨佔的,因此server端tcp連接4元組中只有remote ip(也就是client ip)和remote port(客戶端port)是可變的,因此最大tcp連接爲客戶端ip數×客戶端port數,對IPV4,不考慮ip地址分類等因素,最大tcp連接數約爲2的32次方(ip數)×2的16次方(port數),也就是server端單機最大tcp連接數約爲2的48次方。