http://www.cnblogs.com/zhangkele/articles/8955051.html
常識一:檔案句柄限制
在linux下編寫網絡伺服器程式的朋友肯定都知道每一個tcp連接配接都要占一個檔案描述符,一旦這個檔案描述符使用完了,新的連接配接到來傳回給我們的錯誤是“Socket/File:Can't open so many files”。
這時你需要明白作業系統對可以打開的最大檔案數的限制。
1程序限制
執行 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
2全局限制
執行 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
常識二:端口号範圍限制?
作業系統上端口号1024以下是系統保留的,從1024-65535是使用者使用的。
- 由于每個TCP連接配接都要占一個端口号,是以我們最多可以有60000多個并發連接配接?
- 我想有這種錯誤思路朋友不在少數吧?(其中我過去就一直這麼認為)
分析一下
如何辨別一個TCP連接配接:
系統用一個4四元組來唯一辨別一個TCP連接配接:{local ip, local port,remote ip,remote port}。
好吧,我們拿出《UNIX網絡程式設計:卷一》第四章中對accept的講解來看看概念性的東西,
第二個參數cliaddr代表了用戶端的ip位址和端口号。而我們作為服務端實際隻使用了bind時這一個端口,
說明端口号65535并不是并發量的限制。
server最大tcp連接配接數:(good!!!!!!!!)
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次方。
本文小結
上面給出的結論都是理論上的單機TCP并發連接配接數,實際上單機并發連接配接數肯定要受硬體資源(記憶體)、網絡資源(帶寬)的限制,至少對我們的需求現在可以做到數十萬級的并發了,你的呢?