本帖最后由 堡塔运维香菜卷 于 2023-4-10 12:03 编辑
我有一个服务器,服务器上只有一个网站利用到了nignx, 并发可能在几十左右,cpu负载一直在10%左右。但是过了一段时间,cpu突然就从10%变成了100%。
在问题发生时,网站一直在转圈圈,网络出入、带宽降至0(排除DDOS),内存、TCP连接数等都出于正常状态(缓慢下降)。利用 netstat -s | egrep "listen|LISTEN" 查看 溢出数量,发现一直在增长,证明tcp没能建立连接。通过top查看,是nginx 100%,利用jstack 查看 java程序,当时所有的java线程都处于等待状态,于是可以认定为是nginx占用了cpu,导致网站迟迟无法响应,重启nginx后正常。
事后复盘时,下意识的觉得,是tcp连接数满了,导致nginx建立tcp失败,但是调大了tcp_max_syn_backlog, net.core.somaxconn, tcp_max_tw_buckets, tcp_tw_reuse, ip_local_port_range等参数,仍然会在一段时间之后,cpu从10%突然飙升100%。且通过腾讯云服务器的监控,此时的tcp连接数仅2000左右,远远没达到峰值。
在第二次事故发生时,利用 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 查看 建立连接的数量,发现事故发生时,相比于正常情况,各个数量均在下降,证明tcp链接无法建立,所以排除了tcp队列满导致的溢出。
解决办法:事后利用宝塔云防火墙,封禁请求较高的IP,网站一直就无事发生。但我一直疑惑,那段时间nginx在忙个啥,又不转发请求,又不建立连接,还一直抢夺cpu。直到发现了这个帖子,【已解答】nginx CPU100% 爆 负载100% - Linux面板 - 宝塔面板论坛 (bt.cn) 让我发现利用nginx不止有我的java,还有网站监控报表。于是我将防火墙关闭,将监控报表关闭,目前为止没有出现问题。
我无法完全肯定是报表的问题,并且也没办法把机器给到你们测试,只能给一份反馈,给你们做一个参考。
报表:7.2.2
系统:CentOS 7.9.2009 x86_64(Py3.7.9)
宝塔面板:7.9.3
|
|