1、top命令查看cpu占用最高程序
top
取得cpu占用最高的PID:?27791
2、判斷java程序是直接運(yùn)行在宿主機(jī)還是在容器中
方式一 cgroup
cat /proc/<PID>/cgroup
如果輸出中包含有類似 /docker/<container_id>
的字符串,就表示該進(jìn)程在 Docker 容器中。
方式二 lsns
? lsns命令查看程序的命名空間? ,如果顯示的命名空間信息中有 ipc
, mnt
, net
, pid
, user
, uts
,那么該 PID 很可能在一個(gè) Docker 容器中。
lsns -p PID
方式三?jps
???jps命令查看當(dāng)前在服務(wù)器執(zhí)行的java程序
jps
a、占用CPU最高的PID在jps的列表里,java進(jìn)程可能運(yùn)行在服務(wù)器,可直接執(zhí)行jstack PID
b、占用CPU最高的PID不在jps列表里,java進(jìn)程可能運(yùn)行在容器中。
3、執(zhí)行jstack
? ? ?a、java進(jìn)程直接運(yùn)行在宿主機(jī)上
? ? ? ? jstack命令查看線程、堆棧情況
jstack PID
? ? ?b、java進(jìn)程運(yùn)行在docker容器里
? ? ? ? (1)宿主機(jī)上直接jstack
????????????????
#1、查看java進(jìn)程在容器內(nèi)的PID
docker exec -it $containerid /bin/ps x
#2、獲取容器內(nèi)JAVA_HOME路徑
docker inspect --format '{{ range .Config.Env }}{{ if eq (index (split . "=") 0) "JAVA_HOME" }}{{ index (split . "=") 1 }}{{ end }}{{ end }}' $containerid
#說明:docker inspect --format '{{.Config.Env}}' $containerid 是獲取容器內(nèi)的環(huán)境變量,如果沒配環(huán)境變量需要到容器里查看,可用 which java 命令
#3、執(zhí)行jstack
docker exec -it $containerid $JAVA_HOME/bin/jstack $pid
? ? ? ? (2)進(jìn)入到容器執(zhí)行jstack
? ? ? ? 定位docker容器。根據(jù)lsns -p PID獲取到的信息(jar包名稱可定位項(xiàng)目)定位到docker容器,需人工判斷
lsns -p PID
docker ps | grep 容器相關(guān)信息(名稱、端口、容器ID等)
? ? ? 進(jìn)入到docker容器
docker exec -it 容器ID /bin/bash
#如果/bin/bash不存在,可使用/bin/sh
? ? ?容器內(nèi)查看進(jìn)程ID,ps、jps、top命令都可以
? ? ?執(zhí)行jstack PID文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-727811.html
????????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-727811.html
4、分析jstack信息
到了這里,關(guān)于java 程序cpu占用過高排查的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!