Cpu100%问题处理(包括-线上docker服务)
🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝🍓 更多文章请点击
文章目录
- 一 、Linux中jar部署CPU问题查看
- 1.1 查看CPU使用情况
- 1.2 查看线程级别的CPU使用情况
- 1.3 将10进制线程ID转为16进制
- 1.4 使用jstack获取堆栈信息
- 1.4.1 直接查看
- 1.4.2 下载查看
- 二 、Docker 中部署的java程序CPU查看
- 2.1 思路分析
- 2.2 首先查看CPU实时占用情况
- 2.2.1 top 查看cpu占用率
- 2.2.2 docker stats查看Docker容器的cpu占用率
- 2.3 使用 docker inspect 命令(获取指定容器的详细信息)
- 2.4 打印进程下所有线程的占用情况
- 2.5 找到主进程PID问题后,进入对应java容器
- 2.6 抓取对应线程堆栈信息
- 2.6.1 直接查看
- 2.6.2 下载查看
一 、Linux中jar部署CPU问题查看
1.1 查看CPU使用情况
top
会按CPU使用率排序,帮助快速定位问题进程
top
1.2 查看线程级别的CPU使用情况
top -Hp <PID>
-H 选项显示线程信息 -p 指定进程ID
top -Hp <PID>
例:
top -Hp 112285
类似这种,具体线上问题,根据自己项目进行排查
1.3 将10进制线程ID转为16进制
printf '0x%x\n' <线程id>
1.4 使用jstack获取堆栈信息
1.4.1 直接查看
jstack 进程号 | grep nid=0x+16进制线程号 -A 100
1.4.2 下载查看
那么咱们就可以直接通过以下命令打印线程堆栈
jstack <进程id> >> jstack_out.txt
例如:
jstack 1 >> jstack_out.txt
jstack <进程id> >>jstack_out.txt
二 、Docker 中部署的java程序CPU查看
2.1 思路分析
主要思路就是定位到是哪个
进程
导致的cpu飙升,然后通过进程号追踪具体的线程
。docker命令是为了查出具体哪个容器导致的问题,然后进入容器内部调用jvm相关命令导出堆栈信息
。在堆栈信息中查找之前获得的线程相关信息,就能定位到具体的问题了
2.2 首先查看CPU实时占用情况
2.2.1 top 查看cpu占用率
会按CPU使用率排序,找到cpu最高的进程id是否为java容器进程PID
top
2.2.2 docker stats查看Docker容器的cpu占用率
docker stats
docker stats <容器id>
2.3 使用 docker inspect 命令(获取指定容器的详细信息)
docker inspect <容器id>
找到容器中CPU占用率高的PID是否为top中的进程PID
2.4 打印进程下所有线程的占用情况
查找进程PID占用率高的线程
top -Hp 128720
CPU占用率最高的线程编号为(十进制),然后转化为16进制
printf '0x%x\n' <线程id>
查看cpu那一列,找到异常数据为100%的那一行,并记录
。
2.5 找到主进程PID问题后,进入对应java容器
进入cpu占用高的docker容器
查看容器中具体进程cpu占用率
docker exec -it <container_id> /bin/bash
在容器中使用 top
命令或者 jps
命令查看CPU占用情况
我的容器内部没有top命令,这里使用jps进行查看进程情况
1
就是指的当前运行java服务的进程PID。
2.6 抓取对应线程堆栈信息
2.6.1 直接查看
jstack 进程号 | grep nid=0x+16进制线程号 -A 100
2.6.2 下载查看
那么咱们就可以直接通过以下命令打印线程堆栈
jstack <进程id> >> jstack_out.txt
例如:
jstack 1 >> jstack_out.txt
需要下载的话,可以使用 docker cp到宿主机上
docker cp <container_id>:/path/in/container /path/on/host
把以上jstack_out.txt下载到本地,通过文本工具打开,结合【第2.4步】获取的线程信息,结果定位到具体的线程堆栈。查找代码问题自行修改
文章持续更新…