...
项目使用过程中会遇到多次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:https://history.wiki.smartbi.com.cn/pages/viewpage.action?pageId=35750019
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
...
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]}'
下图是连接状态描述供参考:
...