在重新加载 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