1、top命令查看cpu占用最高程序
top
取得cpu占用最高的PID: 27791
2、判断java程序是直接运行在宿主机还是在容器中
方式一 cgroup
cat /proc/<PID>/cgroup
如果输出中包含有类似 /docker/<container_id>
的字符串,就表示该进程在 Docker 容器中。
方式二 lsns
lsns命令查看程序的命名空间 ,如果显示的命名空间信息中有 ipc
, mnt
, net
, pid
, user
, uts
,那么该 PID 很可能在一个 Docker 容器中。
lsns -p PID
方式三 jps
jps命令查看当前在服务器执行的java程序
jps
a、占用CPU最高的PID在jps的列表里,java进程可能运行在服务器,可直接执行jstack PID
b、占用CPU最高的PID不在jps列表里,java进程可能运行在容器中。
3、执行jstack
a、java进程直接运行在宿主机上
jstack命令查看线程、堆栈情况
jstack PID
b、java进程运行在docker容器里
(1)宿主机上直接jstack
#1、查看java进程在容器内的PID
docker exec -it $containerid /bin/ps x
#2、获取容器内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 是获取容器内的环境变量,如果没配环境变量需要到容器里查看,可用 which java 命令
#3、执行jstack
docker exec -it $containerid $JAVA_HOME/bin/jstack $pid
(2)进入到容器执行jstack
定位docker容器。根据lsns -p PID获取到的信息(jar包名称可定位项目)定位到docker容器,需人工判断
lsns -p PID
docker ps | grep 容器相关信息(名称、端口、容器ID等)
进入到docker容器
docker exec -it 容器ID /bin/bash
#如果/bin/bash不存在,可使用/bin/sh
容器内查看进程ID,ps、jps、top命令都可以
执行jstack PID文章来源:https://www.toymoban.com/news/detail-727811.html
文章来源地址https://www.toymoban.com/news/detail-727811.html
4、分析jstack信息
到了这里,关于java 程序cpu占用过高排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!