谁霸占了cpu

作者: Woople | 来源:发表于2018-05-18 21:37 被阅读121次

    当发现某个服务器的cpu使用率居高不下,这时就需要抓住谁是“真凶”。本文提供一种可以揭开真相的方法。

    1. 通过ps命令显示每个进程中线程的cpu使用率
    >ps -Leo pid,lwp,user,comm,pcpu
    
    PID   LWP USER     COMMAND         %CPU
        1     1 root     systemd          0.5
        2     2 root     kthreadd         0.0
        3     3 root     ksoftirqd/0      0.0
        5     5 root     kworker/0:0H     0.0
    ......
    
    1. 找到所有java进程,并按照第5列降序输出
    >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
    
    1. 这样就找到了cpu使用率最高的进程是7114中的线程7199,将线程id转为16进制printf %x 7199结果为1c1f
    2. 通过jstack 7114 > ~/7114.tmp将进程的堆栈信息输出到临时文件中
    3. 在临时文件中查找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)
    

    总结

    本文介绍了一种结合psjstack命令查找最消耗cpu的java线程并定位到相应代码的方法。

    相关文章

      网友评论

        本文标题:谁霸占了cpu

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