美文网首页
记一次线上cpu占用率高的问题排查

记一次线上cpu占用率高的问题排查

作者: kingTao_ | 来源:发表于2020-07-20 13:43 被阅读0次

    记一次线上cpu占用率高的问题排查

    1.首先想到的就是查看gc日志,发现FULL GC太频繁,甚至FGC次数大于YGC。
    jstat -gc pid 2000
    jstat -gcutil pid 2000
    jstat -gccause pid 2000 查看gc详细原因
    
    jmap -histo pid|head -20 // 查看进程中个类实列占用内存情况
    
    2.进一步查看发现old区GC不了,每次FGC只能回收1%左右
    3.打线程日志观察(可通过IBM Thread工具直观查看)
    jstack -l pid > 文件名
    
    4.dump文件分析
    1.
        可以先使用 top -H 查找当时最耗cpu的线程号,然后再dump线程快照
    2.
        查看堆中内存占用最大的对象,同时触发手动FullGC  
        jmap -histo:live <pid>|head
    3.
        jmap -dump:format=b,file=jmap221_0909.hprof 62784
        # dump文件太大,压缩
        tar -zcvf jmap221_0909.tar.gz jmap221_0909
    
    5.查找到有些地方占用大量线程,分析到具体代码;

    (1)发现问题:CountDownLatch(5)其中有个线程特别耗时

    (2)导致问题:线程暂用对象释放不了,大量对象无法被回收,进入old区,从而引发了无法FGC,导致cpu高占用

    (3)同时浪费了线程资源,导致线程资源不够用

    问题总结

    1.慎重使用多线程,多线程虽然可以解决响应性能问题,但线程的频繁切换同样会浪费cpu资源
    2.多个耗时操作有必要使用多线程,注意设置超时时间,避免阻塞带来的问题

    参考JVM六:查找最最耗cpu的线程或线程时间最长并定位代码

    相关文章

      网友评论

          本文标题:记一次线上cpu占用率高的问题排查

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