定位cpu使用率最高的进程

一般来说,一个进程在某一时刻突然导致cpu的使用率变高,怎么才能定位到哪里出现问题呢,需要如下几个操作。

1.ps命令

>ps -Leo pid,lwp,user,comm,pcpu
  PID   LWP USER     COMMAND         %CPU
    1     1 root     systemd          0.0
    2     2 root     kthreadd         0.0
....

2.排序

>ps -Leo pid,lwp,user,comm,pcpu|sort -k5 -r -n|head --lines 4
  PID   LWP USER     COMMAND         %CPU
    9     9 root     rcu_bh           20.0
   99    99 root     migration/18     10.0
 9901  9901 root     kworker/11:1     5.0

3.查找相关程序(这里以java为例,用的是网上的例子)

>ps -Leo pid,lwp,user,comm,pcpu|awk '$4=="java"{print $0}'|sort -k5 -r -n|head --lines 3

 7114  7199 ocdp     java             0.4
28178 28205 root     java             0.4
 2046  2355 ocdp     java             0.3

4.这样就找到了cpu使用率最高的进程是7114中的线程7199,将线程id转为16进制

5.通过jstack 7114 > ~/7114.tmp将进程的堆栈信息输出到临时文件中

6.在临时文件中查找1c1f,会找到这个线程当前的状态,从而可以定位当相应的代码

"sparkDriverActorSystem-scheduler-1" #41 daemon prio=5 os_prio=0 tid=0x00007f649d661000 nid=0x1c1f waiting on condition [0x00007f646bbfc000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at akka.actor.LightArrayRevolverScheduler.waitNanos(Scheduler.scala:226)
        at akka.actor.LightArrayRevolverScheduler$$anon$8.nextTick(Scheduler.scala:405)
        at akka.actor.LightArrayRevolverScheduler$$anon$8.run(Scheduler.scala:375)
        at java.lang.Thread.run(Thread.java:745)

总结

根据ps和jstack可以定位相关的位置,从而进一步查错

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容