美文网首页
定位cpu使用率最高的进程

定位cpu使用率最高的进程

作者: fly先森 | 来源:发表于2019-01-23 12:07 被阅读0次

    一般来说,一个进程在某一时刻突然导致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可以定位相关的位置,从而进一步查错

    相关文章

      网友评论

          本文标题:定位cpu使用率最高的进程

          本文链接:https://www.haomeiwen.com/subject/oafjjqtx.html