摘要:Linux操做系統,不管是編寫客戶端程序仍是服務端程序,在高併發TCP鏈接處理時,最高的併發數量都要受到系統對用戶單一進程同時可打開文件數量的限制。
Linux操做系統,不管是編寫客戶端程序仍是服務端程序,在高併發TCP鏈接處理時,最高的併發數量都要受到系統對用戶單一進程同時可打開文件數量的限制(由於系統爲每一個TCP鏈接都要建立一個socket句柄,每一個socket句柄同時也是一個文件句柄)。linux
本文檔主要是對文件數量併發限制作修改。vim
一、修改用戶進程可打開文件數限制,如圖所示:segmentfault
說明:服務器
ulimit –n :查看當前系統容許當前用戶進程打開的文件數限制。網絡
默認爲1024:表示當前用戶的每一個進程最多容許同時打開1024個文件。session
這1024個文件中還得去除每一個進程打開的標準輸入、標準輸出、標準錯誤、服務器監聽socket等等,剩下的可用於客戶端socket鏈接的文件數就只有併發
1024-10=1014個左右,也就是基於Linux的程序最多容許同時1014個TCP併發鏈接。socket
(1)修改Linux系統對用戶打開軟限制和硬限制,如圖所示:高併發
vim /etc/security/limits.confui
添加 root soft nofile 1921
root hard nofile 1921
說明:root表明修改了root用戶打開文件的數的限制,能夠用「*」表明全部用戶soft和hard指定要修改的軟限制仍是硬限制。1921指定修改的新限制值,也就是最大打開的文件數(軟限制必定要小於或等於硬限制)
(2)修改 /etc/pam.d/login文件,如圖所示:
添加:session required /lib/security/pam_limits.so
說明:Linux在用戶登陸系統後應該調用pam_limits.so模塊來設置系統對該用戶可以使用的各類資源數量的最大限制(包括用戶可打開的最大文件數限制),
pam_limits.so模塊就會從/etc/security/limits.conf文件中來讀取這個這些限制值
(3)查看linux系統級最大打開文件數限制cat /proc/sys/fs/file-max,如圖所示:
說明:這表示linux系統最多同時容許打開(包括全部用戶打開文件數的總和)96854個文件,是linux系統級的硬限制,全部用戶打開的文件數都不得超過這個數值, 通常不修改這個值,若是想修改,命令爲vim /etc/rc.local。
(4)添加:echo 數值 > /proc/sys/fs/file-max,修改完重啓系統,重啓後執行ulimit –n查看一下,如圖所示:
(5)若是重啓後執行ulimit –n查看的值仍是小於上面修改後的最大值,多是用戶登陸腳本/etc/profile中使用ulimit –n命令,已將用戶同時打開的文件數作了限制,只能在/etc/profile找到ulimit –n限制用戶同時打開的最大文件數,能夠刪除也能夠修改值,重啓系統便可。
(6)上面操做能夠解決高併發TCP鏈接處理打開文件數量的系統限制。
有時儘管解開了系統對用戶同時打開文件數的限制,但仍會出現併發TCP鏈接數增長到必定數量時,再也沒法建立新的TCP鏈接的現象。
二、linux網絡內核對本地端口號範圍有限制,例如當前系統內核限制本地端口號的範圍爲 1024-32768,當系統同一時間存在大量的TCP客戶端鏈接時,因爲每一個TCP客戶端都要佔據一個惟一的本地端口號,若是TCP端口號的範圍不夠用,就會提示 :can't assign requested address ,這就是因爲內核編譯時默認設置的本地端口號範圍過小。
修改:/etc/sysctl.conf
添加:net.ipv4.ip_local_port_range = 1024 65535(最大值要小於或等於65535)
執行:sysctl –p,若是沒有報錯,說明設置成功,顯示內容包含圖中的內容:
以上是單獨一個進程最大同時能夠打開63000多個TCP客戶端鏈接的設置。