🍓 简介: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 下载查看
- 三 、Arthas排查CPU问题(更简洁-`推荐`)
- 3.1 Arthas 简介
- 3.2 安装
- 3.3 启动
- 3.4 查看 dashboard 全局监控
- 3.5 使用 thread查看所有线程信息,同时会列出每个线程的 CPU 使用率
- 3.5.1 thread
- 3.5.2 thread -n [显示的线程个数]
一 、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步】获取的线程信息,结果定位到具体的线程堆栈。查找代码问题自行修改
三 、Arthas排查CPU问题(更简洁-推荐
)
3.1 Arthas 简介
官方文档-很详细
:https://arthas.aliyun.com/doc/
开源地址
:https://github.com/alibaba/arthas
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
同时在开源在的 Github 的项目里的 Issues 里不仅有问题反馈,更有大量的使用案例,也可以进行学习参考。
官方文档很详细,可自行查看
3.2 安装
# github下载
wget https://alibaba.github.io/arthas/arthas-boot.jar
# 或者 Gitee 下载
wget https://arthas.gitee.io/arthas-boot.jar
# 或者 aliyun 下载
curl -O https://arthas.aliyun.com/arthas-boot.jar
3.3 启动
选择应用 java 进程:
启动
java -jar arthas-boot.jar
* [1]: 71560 app.jar
则输入 1,再输入回车/enter
3.4 查看 dashboard 全局监控
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。
$ dashboard
ID NAME GROUP PRIORI STATE %CPU TIME INTERRU DAEMON
17 pool-2-thread-1 system 5 WAITIN 67 0:0 false false
27 Timer-for-arthas-dashb system 10 RUNNAB 32 0:0 false true
11 AsyncAppender-Worker-a system 9 WAITIN 0 0:0 false true
9 Attach Listener system 9 RUNNAB 0 0:0 false true
3 Finalizer system 8 WAITIN 0 0:0 false true
2 Reference Handler system 10 WAITIN 0 0:0 false true
4 Signal Dispatcher system 9 RUNNAB 0 0:0 false true
26 as-command-execute-dae system 10 TIMED_ 0 0:0 false true
13 job-timeout system 9 TIMED_ 0 0:0 false true
1 main main 5 TIMED_ 0 0:0 false false
14 nioEventLoopGroup-2-1 system 10 RUNNAB 0 0:0 false false
18 nioEventLoopGroup-2-2 system 10 RUNNAB 0 0:0 false false
23 nioEventLoopGroup-2-3 system 10 RUNNAB 0 0:0 false false
15 nioEventLoopGroup-3-1 system 10 RUNNAB 0 0:0 false false
Memory used total max usage GC
heap 32M 155M 1820M 1.77% gc.ps_scavenge.count 4
ps_eden_space 14M 65M 672M 2.21% gc.ps_scavenge.time(m 166
ps_survivor_space 4M 5M 5M s)
ps_old_gen 12M 85M 1365M 0.91% gc.ps_marksweep.count 0
nonheap 20M 23M -1 gc.ps_marksweep.time( 0
code_cache 3M 5M 240M 1.32% ms)
Runtime
os.name Mac OS X
os.version 10.13.4
java.version 1.8.0_162
java.home /Library/Java/JavaVir
tualMachines/jdk1.8.0
_162.jdk/Contents/Hom
e/jre
3.5 使用 thread查看所有线程信息,同时会列出每个线程的 CPU 使用率
3.5.1 thread
使用 thread
查看所有线程信息,同时会列出每个线程的 CPU 使用率
使用命令
thread 151
查看 CPU 消耗较高的 151 号线程信息
3.5.2 thread -n [显示的线程个数]
可以直接使用命令 thread -n [显示的线程个数] ,就可以排列出 CPU 使用率 Top N 的线程。
同理自行查看,自己的线程问题,进行分析处理
文章持续更新…