linux中高併發場景下too many open files問題處理

參考:https://www.phpmianshi.com/?id=110

概述:

高併發場景下 too many open files 問題。可以通過設置系統打開文件數,直接影響單個進程容納的客戶端連接數。比如會影響到長鏈接應用如聊天中單個進程能夠維持的用戶連接數, 運行ulimit -n能 看到這個參數值,如果是1024,就是代表單個進程只能同時最多隻能維持1024甚至更少(因爲有其它文件的句柄被打開)。如果開啓4個進程維持用戶鏈 接,那麼整個應用能夠同時維持的連接數不會超過4*1024個,也就是說最多隻能支持4x1024個用戶在線可以增大這個設置以便服務能夠維持更多的 TCP連接。

問題排查:

可以通過查看系統日誌

cat /var/log/messages

 

解決方式:

vim /etc/security/limits.conf  
root soft nofile 100000
root hard nofile 100000

運行 sysctl -p即可生效

ulimit -n 查看

 

/etc/sysctl.conf參數詳解

#表示進程(例如一個worker進程)可能同時打開的最大句柄數,直接限制最大併發連接數
fs.file max = 999999
#1代表允許將狀態爲TIME-WAIT狀態的socket連接重新用於新的連接。對於服務器來說有意義,因爲有大量的TIME-WAIT狀態的連接
net.ipv4.tcp_tw_reuse = 1
#當keepalive啓用時,TCP發送keepalive消息的頻率。默認是2個小時。將其調小一些,可以更快的清除無用的連接
net.ipv4.tcp_keepalive_time = 600
#當服務器主動關閉鏈接時,socket保持FN-WAIT-2狀態的最大時間
net.ipv4.tcp_fin_timeout = 30
#允許TIME-WAIT套接字數量的最大值。超過些數字,TIME-WAIT套接字將立刻被清除同時打印警告信息。默認是180000,過多的TIME-WAIT套接字會使webserver變慢
net.ipv4.tcp_max_tw_buckets = 5000
#UDP和TCP連接中本地端口(不包括連接的遠端)的取值範圍
net.ipv4.ip_local_port_range = 1024  61000
#TCP接收/發送緩存的最小值、默認值、最大值
net.ipv4.tcp_rmem = 4096  32768  262142
net.ipv4.tcp_wmem = 4096  32768  262142
#當網卡接收的數據包的速度大於內核處理的速度時,會有一個隊列保存這些數據包。這個參數就是這個隊列的最大值。
net.core.netdev_max_backlog = 8096
#內核套接字接收/發送緩存區的默認值
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#內核套接字接收/發送緩存區的最大值
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
#解決TCP的SYN攻擊。與性能無關
net.ipv4.tcp_syncookies = 1
#三次握手建立階段SYN請求隊列的最大長度,默認是1024。設置大一些可以在繁忙時將來不及處理的請求放入隊列,而不至於丟失客戶端的請求
net.ipv4.tcp_max_syn_backlog = 1024
#以下可能需要加載ip_conntrack模塊 modprobe ip_conntrack 
#縮短established的超時時間
net.netfilter.nf_conntrack_tcp_timeout_established = 180
#CONNTRACK_MAX 允許的最大跟蹤連接條目,是在內核內存中netfilter可以同時處理的“任務”(連接跟蹤條目)
net.netfilter.nf_conntrack_max = 1048576
net.nf_conntrack_max = 1048576

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章