项目场景:
在一个项目中,后端的代码监控突然预警,接口响应较慢,后来去服务器中才发现服务器的cpu出现了满载的情况,使用率直接到达了100%,后面使用了jstack工具找到系统中出现问题的代码,以此记录一下筛查过程。
问题筛查:
使用top命令,找到占用率高的服务
这里以进程id为7017为例,假设7017的java服务是cpu占用率最高的java服务。
由于是使用了docker部署,不清楚该java服务是什么服务,可以使用ps命令查看7017进程详情。可以发现是oa_personnel服务。
ps -ef|grep 7017
使用 docker ps
找到oa_personnel服务对应的容器名,进入该容器。
docker exec -it new_personnel /bin/bash
进入容器后,使用 top
命令查看当前的java进程id
使用 jstack
命令输出指定java服务进程id的堆栈信息文件,将文件输出到根目录下,方便查询找出问题。
jstack 7 > dump.txt
使用 top
命令后再输入 H
查看到该容器中的线程信息。记录占用率高的线程id,这里为 77
在宿主机中,将容器中输出的堆栈信息文件复制到宿主机中指定目录,方便下载后查阅。
docker cp new_personnel:dump.txt /home/dockerMount
将刚刚在容器中记录的cpu占用率高的线程 id=77 转换为16进制得到 4D
打开堆栈信息文件,转换为十六进制的线程id前加上0X
前缀,并查询到对应的堆栈信息。
解决方法:
后面可以根据堆栈信息找到cpu占用率高的方法,并根据开发人员的经验找出合适的方法处理cpu占用率过高的问题。