今天截珍,浙江同事求救炸渡,說某一個節(jié)點上的某一個端口Tomcat很慢,但其他端口偷拔、節(jié)點的Tomcat沒問題
現(xiàn)象
0.1 前臺請求偶爾很慢很慢,但服務(wù)也沒掛
0.2 具體到某一個Tomcat時沉颂,總是很慢条摸,但進程還在top
1.1 看下當(dāng)前系統(tǒng)負(fù)載 load average 通常在較小,經(jīng)驗值0.x-2.x
夯死的時候铸屉,load average 8+
1.2 看tomcat進程的系統(tǒng)資源使用情況钉蒲,通常CPU<100%,內(nèi)存情況看各地
夯死的時候彻坛,CPU 800%+
1.3 netstat -anp|grep tomcat-pid 觀察網(wǎng)絡(luò)情況
夯死的時候顷啼,大量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 |
看具體進程內(nèi)存情況 top -p PID
RES如果高于Xmx踏枣,勢必會GC看tomcat的JVM參數(shù)
[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與當(dāng)前內(nèi)存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轉(zhuǎn)換為16進制格式:printf "%x\n" TID
最后打印線程的堆棧信息:jstack PID |grep TID -A 30
示例:
jstack 2633 |grep e18 -A 30
浙江這次,cpu占用高的線程躬厌,均為parallel gc...
結(jié)合內(nèi)存情況马昨,JVM參數(shù),判斷為JVM內(nèi)存設(shè)置太低扛施,導(dǎo)致頻繁gc鸿捧。
方案:
推薦加大tomcat JVM中的Xmx,結(jié)合服務(wù)器內(nèi)存配置疙渣,給出合理值匙奴。
如目前加大Xmx至4g