Linux下實現高并發socket最大連接數的配置方法
【訴求場景】

linux操作系統,無論是編寫客戶端程序還是服務端程序,在高并發TCP連接處理時,最高的并發數量都要受到系統對用戶單一進程同時可打開文件數量的限制(因為系統為每個TCP連接都要創建一個socket句柄,每個socket句柄同時也是一個文件句柄)。
本文檔主要是對文件數量并發限制做修改。
【配置方法】
1、修改用戶進程可打開文件數限制,如圖1所示:
圖 1
說明:
ulimit?–n :查看當前系統允許當前用戶進程打開的文件數限制。
默認為1024:表示當前用戶的每個進程最多允許同時打開1024個文件。
這1024個文件中還得去除每個進程打開的標準輸入、標準輸出、標準錯誤、服務器監聽socket等等,剩下的可用于客戶端socket連接的文件數就只有
1024-10=1014個左右,也就是基于linux的程序最多允許同時1014個TCP并發連接。
(1)修改Linux系統對用戶打開軟限制和硬限制,如圖2所示:
vim /etc/security/limits.conf
添加 root soft nofile 1921
root hard nofile 1921
圖 2
說明:root代表修改了root用戶打開文件的數的限制,可以用“*”代表所有用戶soft和hard指定要修改的軟限制還是硬限制。1921指定修改的新限制值,也就是最大打開的文件數(軟限制一定要小于或等于硬限制)
(2)修改 /etc/pam.d/login文件,如圖3所示:
添加:session required /lib/security/pam_limits.so
圖 3
說明:Linux在用戶登錄系統后應該調用pam_limits.so模塊來設置系統對該用戶可使用的各種資源數量的最大限制(包括用戶可打開的最大文件數限制),
pam_limits.so模塊就會從/etc/security/limits.conf文件中來讀取這個這些限制值
(3)查看linux系統級最大打開文件數限制cat /proc/sys/fs/file-max,如圖4所示:
圖 4
說明:這表示linux系統最多同時允許打開(包括所有用戶打開文件數的總和)96854個文件,是linux系統級的硬限制,所有用戶打開的文件數都不得超過這個數值, 一般不修改這個值,如果想修改,命令為vim /etc/rc.local。
(4)添加:echo 數值 > /proc/sys/fs/file-max,修改完重啟系統,重啟后執行ulimit –n查看一下,如圖5所示:
圖 5
(5)如果重啟后執行ulimit –n查看的值還是小于上面修改后的最大值,可能是用戶登錄腳本/etc/profile中使用ulimit –n命令,已將用戶同時打開的文件數做了限制,只能在/etc/profile找到ulimit –n限制用戶同時打開的最大文件數,可以刪除也可以修改值,重啟系統即可。
(6)上面操作可以解決高并發TCP連接處理打開文件數量的系統限制。
有時盡管解開了系統對用戶同時打開文件數的限制,但仍會出現并發TCP連接數增加到一定數量時,再也無法創建新的TCP連接的現象。
2、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,如果沒有報錯,說明設置成功,顯示內容包含圖6中的內容:
圖 6
以上是單獨一個進程最大同時可以打開63000多個TCP客戶端連接的設置。
Linux
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。