记一次线上tomcat访问慢的排查过程
排查步骤
top命令
使用top命令查看cpu使用率发现cpu使用率并不高
导出jvm栈的使用情况
jvm栈内存足够使用,并且并未抛出溢出的异常
查看当前进程的线程数(ps -T -p pid |wc -l)
线程数为295(偏高),于是查看线上tomcat配置的最大线程数(在server.xml中配置),发现线上tomcat使用的默认的配置(maxThreads:150,acceptCount:100),经此判断很有可能是最大线程数的问题
解决方法
因cpu以及jvm内存现都足够使用,将tomcat的maxThreads改为300,acceptCount改为150(在server.xml中配置),修改后发现线程数稳定在320左右并且系统运行良好。
tomcat问题排查经常使用的命令
- 导出jvm栈使用情况:
jmap -heap pid>> jvm_memory.log
jmap -histo pid> jvm_jmap.log - 查看端口下连接数(状态为ESTAB )
netstat -na | grep ESTAB | grep 端口 | wc -l - 查看总连接数(状态为ESTAB )
netstat -na | grep ESTAB | wc -l - 查看java线程数(如linux下有多个java进程,那么这个是这几个进程总共的线程数)
ps -efL |grep java|wc -l - 查看tomcat已用线程数(默认maxThreads:150,acceptCount:100,共支持250个连接,超过报错,不超过请求在acceptCount等待)
ps aux |grep tomcat(找到tomcat进程的pid)、ps -T -p pid |wc -l(查询进程下的线程数) - 查询当前整个系统已用的线程或进程数
pstree -p | wc -l - 整个系统已用的线程或进程数
cat /proc/sys/kernel/pid_max - 查看系统总open files的消耗情况:cat /proc/sys/fs/file-nr
cat /proc/sys/fs/file-nr
22048 0 3254456
第一列表示已打开的句柄数
第二列表示已分配但是未使用的句柄数
第三列表示系统总的句柄数,即 file-max
- 单个进程的open files
ulimit -n - 查看某一个进程的文件打开数量
lsof -p pid | wc -l
如当前进程文件打开数量超过系统配置的最大数量时会报错 - 查看系统总连接数
netstat -ant|awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}’
这个连接数可能会比实际的连接数要大,因为linux是定时清理连接的,当一个连接因两方关闭或超时断开时要到linux清理连接时才能被回收,这个时间是可以配置的