Linux

執行“nginx reload”時 nginx 無響應

  • June 21, 2016

在重新載入 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 正在等待它們在重新載入後過期,我不太確定如果不查看程式碼。

您可以嘗試降低該值,看看是否有幫助。

引用自:https://serverfault.com/questions/784140