作業系統與socket連線數限制備忘錄
詳細解釋請檢視記錄來源
1:Linux單機
記錄來源:http://soft.chinabyte.com/os/285/12349285.shtml
一)核心限制
a)核心初始化區間
修改或新增/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000 #最小1024 最大65535
b)ip_table防火牆限制
修改或新增/etc/sysctl.conf
net.ipv4.ip_conntrack_max = 10240 #此數字的大小會影響核心記憶體的佔用,越大暫用越多
二)系統檔案控制代碼數限制
a)使用者檔案控制代碼數
檢視:ulimit -n
修改/etc/security/limits.conf
* soft nofile 10240
* hard nofile 10240 #soft的數字必須小於等於hard的數字,*可以替換為具體的使用者
修改或新增/etc/pam.d/login
session required /lib/security/pam_limits.so #系統在使用者登入時去按照設定初始化使用者
b)系統最大檔案控制代碼數
檢視:cat /proc/sys/fs/file-max #硬體最大支援的控制代碼數量,此項為系統預設最優化數字,儘量不要修改
三)/etc/sysctl.conf清單
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
2:windows
記錄來源:http://www.cnblogs.com/zwq194/archive/2012/12/14/2817673.html
一)最大TCP連線數
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] TcpNumConnections = 0x00fffffe (Default = 16,777,214)
二)最大動態埠數
max不能超過65535,最小盡量不要小於1024
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] MaxUserPort = 5000 (Default = 5000, Max = 65534)
三)最大TCB數(也可以稱之為最大tcp控制塊)
每個tcp連線由0.5kb的pagepool 和 0.5KB 的Non-pagepool組成
srv非server版最大預設為1000 最小實體記憶體64M
server版最大2000
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro = 1000, Srv=2000)
四)最大tcb hash table數量
HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip \Parameters] MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
這個值指明分配 pagepool 記憶體的數量,也就是說,如果MaxFreeTcbs = 1000 , 則 pagepool 的記憶體數量為 500KB那麼 MaxHashTableSize 應大於 500 才行。這個數量越大,則Hash table 的冗餘度就越高,每次分配和查詢 TCP 連線用時就越少。這個值必須是2的冪,且最大為65536.
3:程式設計相關
使用支援高併發網路I/O的程式設計技術在Linux上編寫高併發TCP連線應用程式時,必須使用合適的網路I/O技術和I/O事件分派機制。可用的I/O技術有同步I/O,非阻塞式同步I/O(也稱反應式I/O),以及非同步I/O.在高TCP併發的情形下,如果使用同步I/O,這會嚴重阻塞程式的運轉,除非為每個TCP連線的I/O建立一個執行緒。但是,過多的執行緒又會因系統對執行緒的排程造成巨大開銷。因此,在高TCP併發的情形下使用同步 I/O是不可取的,這時可以考慮使用非阻塞式同步I/O或非同步I/O.非阻塞式同步I/O的技術包括使用select(),poll(),epoll等機制。非同步I/O的技術就是使用AIO.
從I/O事件分派機制來看,使用select()是不合適的,因為它所支援的併發連線數有限(通常在1024個以內)。如果考慮效能,poll()也是不合適的,儘管它可以支援的較高的TCP併發數,但是由於其採用"輪詢"機制,當併發數較高時,其執行效率相當低,並可能存在I/O事件分派不均,導致部分TCP連線上的I/O出現"飢餓"現象。而如果使用epoll或AIO,則沒有上述問題(早期Linux核心的AIO技術實現是通過在核心中為每個 I/O請求建立一個執行緒來實現的,這種實現機制在高併發TCP連線的情形下使用其實也有嚴重的效能問題。但在最新的Linux核心中,AIO的實現已經得到改進)。
綜上所述,在開發支援高併發TCP連線的Linux應用程式時,應儘量使用epoll或AIO技術來實現併發的TCP連線上的I/O控制,這將為提升程式對高併發TCP連線的支援提供有效的I/O保證。