今天,浙江同事求救,说某一个节点上的某一个端口Tomcat很慢,但其他端口、节点的Tomcat没问题
现象
0.1 前台请求偶尔很慢很慢,但服务也没挂
0.2 具体到某一个Tomcat时,总是很慢,但进程还在top
1.1 看下当前系统负载 load average 通常在较小,经验值0.x-2.x
夯死的时候,load average 8+
1.2 看tomcat进程的系统资源使用情况,通常CPU<100%,内存情况看各地
夯死的时候,CPU 800%+
1.3 netstat -anp|grep tomcat-pid 观察网络情况
夯死的时候,大量CLOSE_WAIT连接未释放jstat -gcutil PID
查看这个进程的gc情况
jstat -gcutil 7317
S0 | S1 | E | O | M | CCS | YGC | YGCT | FGC | FGCT | GCT |
---|---|---|---|---|---|---|---|---|---|---|
0.00 | 11.41 | 37.17 | 57.94 | 98.47 | 97.47 | 39 | 1.448 | 4 | 0.498 | 1.945 |
看具体进程内存情况 top -p PID
RES如果高于Xmx,势必会GC看tomcat的JVM参数
[root@XXX-WEB-01 admin]# ps -ef|grep tomcat
xxxx 7317 1 0 Nov20 ? 00:07:38 /home/dacp/jdk1.8.0_51/jre/bin/java -Djava.util.logging.config.file=/home/dacp/Tomcat-18080/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms1g -Xmx2g -XX:+UseParallelOldGC -Djava.security.egd=file:/dev/../dev/urandom -Djava.endorsed.dirs=/home/dacp/Tomcat-18080/endorsed -classpath /home/dacp/Tomcat-18080/bin/bootstrap.jar:/home/dacp/Tomcat-18080/bin/tomcat-juli.jar -Dcatalina.base=/home/dacp/Tomcat-18080 -Dcatalina.home=/home/dacp/Tomcat-18080 -Djava.io.tmpdir=/home/dacp/Tomcat-18080/temp org.apache.catalina.startup.Bootstrap start
比较Xmx与当前内存RES情况
- 如果CPU过高,找到该进程后,定位具体线程或代码,首先显示线程列表,并按照CPU占用高的线程排序:
ps -mp PID -o THREAD,tid,time | sort -rn | head -10
USER | %CPU | PRI | SCNT | WCHAN | USER | SYSTEM | TID | TIME |
---|---|---|---|---|---|---|---|---|
xxxx | 0.6 | - | - | - | - | - | - | 00:07:58 |
xxxx | 0.2 | 19 | - | futex_ | - | - | 3270 | 00:02:49 |
xxxx | 0.0 | 19 | - | inet_c | - | - | 3277 | 00:00:00 |
xxxx | 0.0 | 19 | - | inet_c | - | - | 3273 | 00:00:00 |
xxxx | 0.0 | 19 | - | inet_c | - | - | 3271 | 00:00:00 |
xxxx | 0.0 | 19 | - | inet_c | - | - | 3203 | 00:00:05 |
xxxx | 0.0 | 19 | - | futex_ | - | - | 7644 | 00:00:00 |
xxxx | 0.0 | 19 | - | futex_ | - | - | 3420 | 00:00:00 |
xxxx | 0.0 | 19 | - | futex_ | - | - | 3288 | 00:00:06 |
将需要的线程ID转换为16进制格式:printf "%x\n" TID
最后打印线程的堆栈信息:jstack PID |grep TID -A 30
示例:
jstack 2633 |grep e18 -A 30
浙江这次,cpu占用高的线程,均为parallel gc...
结合内存情况,JVM参数,判断为JVM内存设置太低,导致频繁gc。
方案:
推荐加大tomcat JVM中的Xmx,结合服务器内存配置,给出合理值。
如目前加大Xmx至4g