top命令得到pid
相关字段解释:
- PID — 进程id
- USER — 进程所有者
- PR — 进程优先级
- NI — nice值。负值表示高优先级,正值表示低优先级
- VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- SHR — 共享内存大小,单位kb
- S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- %CPU — 上次更新到现在的CPU时间占用百分比
- %MEM — 进程使用的物理内存百分比
- TIME+ — 进程使用的CPU时间总计,单位1/100秒
- COMMAND — 进程名称(命令名/命令行)
top -Hp 获取CPU占用高的线程
top -H -p 84694含义:
- -H 指显示线程
- -p 是指定进程
84694是第一步得到的进程的pid。
通过该命令可以查看该进程里面的线程的cpu占用情况。
可以看到84858的线程占cpu高达75.7%。
jstack获取jvm线程堆栈
jstack用于生成jvm当前时刻的线程快照。线程快照是当前jvm内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
#84694是导致CPU占用高的进程号
sudo jstack -F 84694 > stack.txt
#84858是导致CPU占用高的进程的线程号
cat stack.txt | grep -A 10 84858
现在已经找到了导致cpu高的线程执行的代码行,通过分析具体代码即可知道原因。就本例而言,该线程正在等待写锁,说明是IO压力导致的CPU高,可以进一步通过iostat分析验证。