Linux
執行“nginx reload”時 nginx 無響應
在重新載入 nginx 時,我開始在消息日誌中收到錯誤消息“埠 443 上可能出現 SYN 氾濫”,並且當時 nginx 似乎變得完全沒有響應(很長一段時間),導致 zabbix 報告“nginx is down”,ping 0s。當時的RPS大約是1800。
但是,伺服器在其他非 Web 埠(SSH 等)上保持響應
我應該在哪裡查看以及應該顯示哪些配置(sysctl、nginx)才能找到其根本原因。
提前致謝。
升級版:
一些附加資訊:
$ netstat -tpn |awk '/nginx/{print $6,$7}' |sort |uniq -c 3266 ESTABLISHED 31253/nginx 3289 ESTABLISHED 31254/nginx 3265 ESTABLISHED 31255/nginx 3186 ESTABLISHED 31256/nginx
nginx.conf 範例:
worker_processes 4; timer_resolution 100ms; worker_priority -15; worker_rlimit_nofile 200000; events { worker_connections 65536; multi_accept on; use epoll; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_requests 100; keepalive_timeout 65; }
自定義 sysctl.conf
net.ipv4.ip_local_port_range=1024 65535 net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.all.secure_redirects=0 net.ipv4.conf.all.send_redirects=0 net.core.netdev_max_backlog=10000 net.ipv4.tcp_syncookies=0 net.ipv4.tcp_max_syn_backlog=20480 net.ipv4.tcp_synack_retries=2 net.ipv4.tcp_syn_retries=2 net.ipv4.tcp_rmem=4096 87380 16777216 net.ipv4.tcp_wmem=4096 65536 16777216 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.netfilter.nf_conntrack_max=1048576 net.ipv4.tcp_congestion_control=htcp net.ipv4.tcp_timestamps=1 net.ipv4.tcp_no_metrics_save=1 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_max_tw_buckets=1400000 net.core.somaxconn=250000 net.ipv4.tcp_keepalive_time=900 net.ipv4.tcp_keepalive_intvl=15 net.ipv4.tcp_keepalive_probes=5 net.ipv4.tcp_fin_timeout=10
UPD2
在大約 1800 RPS 的正常負載下,當我在 80 和 443 埠上將 nginx 上的積壓設置為 10000,然後重新載入 nginx 時,它變成使用更多 RAM(使用了 4GB 實例中的 3.8Gb,並且一些工人被 OOM 殺死-killer),並且 worker_priority 在 -15 負載超過 6(而我的實例只有 4 個核心)。因此,該實例非常滯後,我將 worker_priority 設置為 -5,並將每個埠的 backlog 設置為 1000。目前,它使用較少的記憶體,峰值負載為 3.8,但是,nginx 在重新載入後仍然會在一兩分鐘內無響應。所以,問題依然存在。
一些netstat詳細資訊:
netstat -tpn |awk '/:80/||/:443/{print $6}' |sort |uniq -c 6 CLOSE_WAIT 14 CLOSING 17192 ESTABLISHED 350 FIN_WAIT1 1040 FIN_WAIT2 216 LAST_ACK 338 SYN_RECV 52541 TIME_WAIT
如果你有:
keepalive_timeout 65;
我可以想像連接終止和工作人員重新啟動可能需要一段時間。如果 nginx 正在等待它們在重新載入後過期,我不太確定如果不查看程式碼。
您可以嘗試降低該值,看看是否有幫助。