參考: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