docker排查Springboot容器CPU飙高
·
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
更多推荐
所有评论(0)