zoukankan      html  css  js  c++  java
  • 一次大量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 文件中的数据库,问题解决。

  • 相关阅读:
    javaDoc 注释规范
    [阿里云] 如何 开放云主机 非80 端口?
    [Go] 跨平台文件系统监控工具 fsnotify 应用举例
    如何利用 jQuery 修改 css 中带有 !important 的样式属性?
    code.google.com/p/log4go 下载失败
    [Go] ok 判断 汇总
    [Go] 编码规范
    《Go语言实战》摘录:7.3 并发模式
    《Go语言实战》摘录:7.2 并发模式
    《Go语言实战》摘录:7.1 并发模式
  • 原文地址:https://www.cnblogs.com/liuquan/p/7358203.html
Copyright © 2011-2022 走看看