(本文档仅供参考)
问题现象
项目使用过程中会遇到多次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 让参数生效。