cpu使用率过高问题定位

  1. top命令分析进程的CPU使用率
    执行top -c ,显示进程运行信息列表,可以看到每个进程的CPU使用率
    键入大写P,让进程根据CPU使用率从大到小排序。


    clipboard.png
  2. top -Hp找到最耗CPU的线程
    top -Hp 40193,显示一个进程的线程运行信息列表,键入大写p,使线程按照CPU使用率排序从大到小排序
    图示:


    clipboard1.png

    如上图,进程40193内,最耗CPU的线程PID为40217

或者:
使用jps 通过pId查询到程序的名称
ps -mp pId -o Thread,tid,time 获取线程ID

  1. 将线程PID转化为16进制,之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。
    printf “%x\n” 40217

    图示:
    clipboard2.png

    如上图,40217对应的16进制是0x9d19,

4:查看线程的堆栈信息,看看是什么原因引起的CPU使用率过高
工具:pstack/jstack/grep
方法:jstack 40193 | grep 0x9d19 --color -C 200
打印进程堆栈,堆栈信息举例:

"pool-26-thread-6" #1441 prio=5 os_prio=0 tid=0x00007f7368058800 nid=0x3b4f5 runnable [0x00007f7234fb2000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.Throwable.getStackTraceElement(Native Method)
        at java.lang.Throwable.getOurStackTrace(Throwable.java:827)
        - locked <0x0000000084fcb808> (a java.lang.Exception)
        at java.lang.Throwable.getStackTrace(Throwable.java:816)
        at java.lang.Thread.getStackTrace(Thread.java:1552)
        at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1014)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:940)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:930)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:102)
        ...
        省略
        ...
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容