1、linux安装wget命令
sudo yum -y install wget
2、下载安装Arthas
sudo wget https://alibaba.github.io/arthas/arthas-boot.jar
3、docker容器安装Arthas(将arthas copy到容器里面)
docker cp arthas-boot.jar a03b20d2d33c:/home
找到占用CPU最高的容器ID
4、进入容器
docker exec -it a03b20d2d33c /bin/sh
5、启动arthas
java -jar arthas-boot.jar
也可直接进入容器,在容器里面进行下载arthas,然后在执行启动arthas命令
输入命令之后,确定好进程,回车即可
6、dashboard命令,查看程序的线程、内存、GC、运行环境信息
7、thread 命令,查看占用CPU最高的线程,总线程数,跟线程状态对应的数量
Threads Total: 303, NEW: 0, RUNNABLE: 76, BLOCKED: 0, WAITING: 60, TIMED_WAITING: 152, TERMINATED: 0, Internal threads: 15
8、thread ID 根据线程定位问题(根据线程ID打印堆栈信息)
9、线程池查看
thread | grep pool
10、线程池死锁问题排查
thread --state BLOCKED
11、火焰图
什么时候用火焰图:当发现CPU的占用率与实际业务应该出现的占用率不相符,或者对Nginx worker的资源使用率(CPU、内存、磁盘IO)出啊先怀疑情况下,使用火焰图进行抓取,对 CPU 占用率低、吐吞量低的情况也可以使用火焰图的方式排查程序中是否有阻塞调用导致整个架构的吞吐量低下
启动火焰图:profiler start
获取采集的sample数量:profiler getSamples
查看profiler状态:profiler status
停止profiler:profiler stop
通过CPU火焰图去定位问题:
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
1、通过dashboard查看占用CPU高的线程
2、通过thread 查看线程占用资源较高
3、thread ID定位具体方法问题