栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[问题记录] CPU 负载飚高

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[问题记录] CPU 负载飚高

文章目录

一、问题现象二、问题原因三、排查手段四、诱因分析

4.1、[用户态CPU使用率高] GC频繁4.2、[用户态CPU使用率高] 计算密集4.3、[系统态CPU使用率高] 上下文切换频繁

一、问题现象
    用户态CPU使用率(%CPU us)高居不下;系统态CPU使用率(%CPU sy)高居不下;
二、问题原因
    用户态CPU使用率高:无阻塞线程数多、无限循环、计算密集、GC频繁等;系统态CPU使用率高:阻塞的线程数多、等待锁、等待IO,导致CPU上下文频繁切换;
三、排查手段
    top -Hp 命令(可选用 htop 命令):查看CPU使用率最高的线程;jstack | grep -A 10 命令(可选用 show-busy-java-threads 工具):查看线程的状态,90%的问题都可以通过 jstack 命令分析出原因;vmstat 命令:查看系统情况,可用于排查大量线程调用系统函数导致的CPU上下文切换频繁的问题;async-profiler 工具:生成进程的火焰图(CPU占比分布、堆内存占比分布);
四、诱因分析 4.1、[用户态CPU使用率高] GC频繁

分析方法:jmap 堆内存转存后分析 GC 原因;

(1) top -Hp 命令找到CPU使用率最高的线程
(2) jstack | grep -A 命令查看线程的状态,发现正在 GC;
(3) jstat -gcutil 命令查看进程的GC情况,发现Eden区和Old区几乎打满,YGC和FGC非常频繁,猜测可能是内存泄漏;

4.2、[用户态CPU使用率高] 计算密集

分析方法:

jstack 或 show-busy-java-threads 查看线程的状态和堆栈信息;[可选] 火焰图分析,查看 CPU、堆内存占用的分布情况;

(1) top -Hp 命令:发现 Cpu0、Cpu1 两个核的使用率都打满了

(2) jstack | grep -A 10 命令:查看线程的状态、堆栈信息;(推荐使用 show-busy-java-threads )

show-busy-java-threads 的结果一目了然

(3) 可通过火焰图查看进程的CPU、堆内存的占用分布情况,推荐 async-profiler 工具,前提是手速要够快,否则CPU降下来了就不准,如下展示在用户态CPU使用率高的情况下捉取30秒的进程火焰图

堆内存的占用分布(sh profiler.sh -e alloc -d 30 -f /tmp/flamegraph_22100.html 22100)
CPU的占用分布(sh profiler.sh -e cpu -d 30 -f /tmp/flamegraph_22100.html 22100)
4.3、[系统态CPU使用率高] 上下文切换频繁

分析方法:

vmstat 命令看看系统情况,重点关注 system、cpu 类目jstack 或者 show-busy-java-threads 工具进一步分析

(1) top -Hp 命令:用户态和系统态CPU使用率都不低。系统命令明显卡顿。
(2) vmstat 命令:cs列表示每秒CPU上下文切换次数,下图可见上下文切换相当频繁,说明大量的CPU时间分片都浪费在线程切换上,猜测可能是线程数过多,且每个线程内部都调用了系统函数,例如文件IO、网络IO、synchronize锁等等;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704310.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号