页面树结构
转至元数据结尾
转至元数据起始

(本文档仅供参考)

问题现象

       项目使用过程中会遇到多次mysql假死和tomcat假死的问题(假死指的是进程存在,但是系统无法正常使用)。

排查方式

       1、首先运行linux基础命令,查看linux系统负载情况,重点关注load average、内存和进程资源的消耗统计

            命令:top
                      free -mh
                      df -h

           

            如上图Linux系统负载正常 ,排除cpu和内存占用过高导致的问题。

     2、查看应用的日志(mysql的日志和tomcat的日志)

          确认mysql 日志和tomcat日志本身无异常,排除其他异常导致的应用问题

     3、针对tomcat可以查看一下线程日志
          命令:jstack pid

          用途:排除死锁和阻塞

      4、以上都正常的情况下,查看一下网络连接释放情况

          命令:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

          如果发现有大量的CLOSE_WAIT 进程,应该是问题所在,百度一下,可以查看到类似的文章
          https://cloud.tencent.com/developer/article/1381359 
          https://blog.csdn.net/lxlmj/article/details/53005021 

          如果要看详细查看CLOSE_WAIT 进程,可以通过netstat -an|grep 端口号 进行分析,如smartbi的访问端口号是433,则 netstat -an|grep 443


解决方案

      1、修改文件句柄数【需要通知用户运维人员处理】

          参考wiki:解决Too many open files异常

      2、修改Linux系统的连接超时参数【需要通知用户运维人员处理】
          vim /etc/sysctl.conf 在文件末端加上以下内容:

          net.ipv4.tcp_syncookies = 1
          net.ipv4.tcp_tw_reuse = 1
          net.ipv4.tcp_tw_recycle = 1
          net.ipv4.tcp_fin_timeout = 30

          然后执行 /sbin/sysctl -p 让参数生效。

          注:可以把 “四、其他内核参数调整” 中2个设置一并在此处设置,避免后期遇到另一类句柄数超限的问题。

          


      3、针对tomcat应用,修改Tomcat server.xml文件,增加连接超时时间(无论是http协议还是https协议都需要添加socket超时设置) connectionTimeout="30000"

         

其他信息补充

       1、验证网络连接情况命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  

           下图是连接状态描述供参考:

          

     2、ulimit 设置不生效情况

          很多时候虽然我们按照wiki修改了limit.conf 文件使文件句柄数增加,但是重新登录的时执行ulimit -n 还是会返回1024,这个主要是因为limit.conf 文件生效需要依赖ssh服务中usepam yes 选项,如果linux服务器这个选项被注释掉或者usepam no 那么就会导致上诉情况,目前的解决方案是在修改linux的环境变量文件,使其生效。

          vi /etc/profile 在末端添加

          ulimit -n 65535

          然后执行 source /etc/profile让参数生效。

          注:有的时候我们不止要设置句柄数是65535 还需要设置其他的参数,在设置之前先执行ulimit -a 查看当下系统的限制,然后再决定是否进行调整其他参数到环境变量中生效。

                 ulimit -u 10000
                 ulimit -n 65535
                 ulimit -d unlimited 
                 ulimit -m unlimited 
                 ulimit -s unlimited 
                 ulimit -t unlimited 
                 ulimit -v unlimited 

     3、其他内核参数调整[需要通知用户运维人员处理]

          有些场景下,会遇到 User limit of inotify instances reached or too many open files 异常,这个和句柄数关系不大,需要修改max_user_instances 数量

          修改的方式如下:

          vim /etc/sysctl.conf 在文件末端加上以下内容:

    fs.inotify.max_user_watches=524288
    fs.inotify.max_user_instances=8192
   

    然后执行 /sbin/sysctl -p 让参数生效。


      

      

           


  • 无标签