1.使用docker stats

2.进入对应容器内部

docker exec -it wxdevops-service /bin/sh

3.使用top命令查看哪个进程cpu最高

top

4.查看进程下的哪个线程cpu飙高(7为进程pid)

top -Hp 7

5.将线程号转为16进制(51为线程pid),我的结果为33

printf "%x\n" 51

6.将进程信息打印出来 (7为进程pid)

jstack 7  > thread_dump.txt

7.退出容器,将容器内的进程信息copy到外面

docker cp wxdevops-service:thread_dump.txt thread_dump.txt

8.txt查找出错信息

直接文件内搜索’0x33‘,这里的33是我的线程十六进制pid

结果如下

对应代码块

可能遇到的问题及解决:

1.此使用docker进行java项目的打包为镜像部署的,镜像文件可参考如下

# 基础镜像  更改为使用JDK镜像,这里以Alpine为例,体积更小。若需Debian可继续使用Debian的JDK镜像
# 本来使用的openjdk:8-jre,但是由于不是完整的jdk不能使用jstack 命令所以使用完整的jdk
FROM openjdk:8-jdk-alpine

# author
LABEL MAINTAINER="zhsd"

# 更新软件包列表并安装常用工具(如果是Debian镜像,使用apt-get)Alpine Linux的包管理命令是apk
# 这里确定进入容器后可使用top命令
RUN apk add --no-cache procps nano vim less  

# 挂载目录、创建目录、复制jar、设置时区和启动命令等保持不变
VOLUME /home/wx
RUN mkdir -p /home/wx
COPY ./wcyy-service-0.0.1-SNAPSHOT.jar /home/wx/wxdevops-service.jar
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT ["java","-Duser.timezone=Asia/Shanghai","-jar","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/home/app/dumps/heapdump.hprof","/home/wx/wxdevops-service.jar"]

2.在docker容器启动的时候务必加上–init,如

docker run -t --init  -d --restart=always --name wxdevops-service  -p 10003:10003 wxdevops-service;

否则可能报错jstack Unable to get pid of LinuxThreads manager thread

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐