一次大量TIME_WAIT和Recv-Q 堵塞问题排查思路
记录一下周末出现问题~ 仅自己摘记不做任何参考。
第一天故障:
现象:
公司销售群和售后群炸了,说老后台(1.0版本)崩溃了,因为还有部门的业务没来得及迁移到新后台,我当时正在打农药哈哈~
后台504打不开,偶尔能刷出来也是很慢。。大概过了10分钟新后台也挂了,也就是公司所有业务全瘫痪了。。。问题严重了。。。
排查及原因:
先登陆到我们比较重视的新后台查看,有慢日志看慢日志没有慢日志先加慢日志。
简单查看了一下top 发现load较高,有时候能到20左右,忽高忽低不是很稳定,其他都还算正常。。
接着netstat大法查看下连接数情况,统计了一下大概8000多time_wait,平常肯定没这么多的量。
次数省略几千行...
strace -p http的pid strace -p php的pid #通过strace工具追踪了一下web服务和php的进程id,查看他正在做什么?
通过跟踪发现有很多调用一个数据库的函数在堆积,找到相应文件下发现原来这里有一个数据库已经下线了,在切换数据库的时候没有更改这个地方,白天切换的时候没发现问题,到了晚上高峰期大量的调用在排队,(今天早上来了问了一下研发,这个调用超时时间是5秒) 导致了大量的TIME_WAIT等待。。堵死。。
处理:
将数据库更改为正常的IP解决了~
第二天老后台问题:
晚上9点左右同样的情况。直接查看连接数情况,果然又堵车了。
又堵塞了,大量的连接数不释放,目前业务已经崩了大量的投诉,先快速释放连接数恢复业务。
[root@vm-10 ]# cat /etc/sysctl.conf kernel.sysrq = 1 kernel.core_uses_pid = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.ip_forward = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.default.rp_filter = 2 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.all.arp_announce = 2 net.ipv4.tcp_tw_reuse = 1 #新增 net.ipv4.tcp_tw_recycle = 1 #新增 net.ipv4.tcp_fin_timeout = 30 #新增 [root@vm-10 ]#
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
果然调整完后连接数快速降下来了,然后strace查了一下系统调用,发现还有一个数据库没更改
lstat("/aaa/www/html/hangye.aaa.com/bbb_OPEN_VIDEO/index.php", {st_mode=S_IFREG|0644, st_size=14994, ...}) = 0 stat("/aaa/www/html/hangye.aaa.com/s", 0x7ffd5f5e22b0) = -1 ENOENT (No such file or directory) lstat("/aaa", {st_mode=S_IFDIR|0755, st_size=103, ...}) = 0 lstat("/aaa/www", {st_mode=S_IFDIR|0755, st_size=38, ...}) = 0 lstat("/aaa/www/html", {st_mode=S_IFDIR|0755, st_size=107, ...}) = 0 lstat("/aaa/www/html/hangye.aaa.com", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat("/aaa/www/html/hangye.aaa.com/s", 0x7ffd5f5e22b0) = -1 ENOENT (No such file or directory) setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0 rt_sigaction(SIGPROF, {0x7f5710190cc0, [PROF], SA_RESTORER|SA_RESTART, 0x7f5719175660}, {0x7f5710190cc0, [PROF], SA_RESTORER|SA_RESTART, 0x7f5719175660}, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0 getcwd("/", 4095) = 2 chdir("/aaa/www/html/hangye.aaa.com/bbb_OPEN_VIDEO") = 0 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={30, 0}}, NULL) = 0 gettimeofday({1502634914, 509085}, NULL) = 0 open("/aaa/www/html/hangye.aaa.com/bbb_OPEN_VIDEO/index.php", O_RDONLY) = 31
更改/aaa/www/html/hangye.aaa.com/bbb_OPEN_VIDEO/index.php 文件中的数据库,问题解决。