一.一般的找可能原因的思路:
    1.通过故障时间思考是否有定时任务执行,这个任务是不是涉及计算
    2.思考最近是不是上线某个可能导致问题的c端功能,它是不是涉及计算,有没有日志可以参考
    3.思考是不是接收下游系统调用,或者接收上游系统消息过多而没有限流
    由于现在的应用往往布置在弹性容器上,所以很难直接连上去用指令查看情况。以上方法多是基于推测,不能100%保证问题解决。需要一个能实时动态展示CPU负载详细情况的组件帮助定位问题。
    二.用async-profiler创建火焰图:

    1. git clone git://github.com/jvm-profiling-tools/async-profiler
    2. cd async-profiler/
    3. make
    4. ./profiler.sh -d 60 -o collapsed -f /tmp/test_01.txt (java程序的进程编号)
    5. cd ..
    6. cd FlameGraph/
    7. #脚本文件去 https://github.com/brendangregg/FlameGraph 获取
    8. perl flamegraph.pl --colors=java /tmp/test_01.txt > test_01.svg
    9. #则该svg是所需火焰图文件

    火焰图示例:
    CPU使用率高的问题怎样排查? - 图1
    三.观察火焰图的方法:
    下边的长方形依赖上边的长方形,所以应该找上层最宽的长方形。
    如果生产环境拿不到当时的数据,通常可以对测试环境压测,得到图像并观察。