CPU 飙高该如何排查

CPU 飙高排查我一般分三步:

第一:确认是用户态还是系统态高,用 top 看 us/sy/wa

第二:定位具体进程,再定位线程

第三:结合线程栈分析是死循环、锁竞争、GC 频繁还是线程过多

1)us 高、sy 低、wa 低

含义:纯用户态计算,无阻塞、无系统调用、无 IO

典型原因

  • 死循环
  • 复杂计算 / 递归
  • JSON / 序列化疯狂
  • 正则回溯爆炸
  • GC 线程疯狂(VM Thread、GC task)

栈特征大量 RUNNABLE,一直占 CPU 不释放

一句话

us 高 sy 低 = 业务代码死循环 / 计算密集 / GC 频繁,直接 jstack 找 RUNNABLE 栈。

2)sy 高、us 低 / 一般

含义:内核态繁忙,系统调用频繁

典型原因

  • 线程频繁切换(thread count 极高)
  • 大量网络 IO:accept/read/write 太多
  • 大量锁竞争(mutex、自旋锁)
  • 大量小 IO、频繁系统调用

栈特征

  • RUNNABLE 但在native 方法
  • epollWaitreadwritelock
  • 大量线程 WAITING / BLOCKED

一句话

sy 高 = 线程太多、切换频繁、锁竞争、网络 IO 密集,看线程数 + 锁。

3)wa 高(iowait 高)、us/sy 都不高

含义:CPU 空闲,但在等磁盘 IO

典型原因

  • 磁盘满、磁盘慢
  • 大量日志打印、文件读写
  • SQL 慢查询(大量物理 IO)
  • 大量阻塞 IO(InputStream、FileWriter)

栈特征

  • 大量 RUNNABLE 但卡在 IO
  • readwriteFileInputStream
  • 数据库驱动 socketRead0

一句话

wa 高 = 不是 CPU 问题,是 IO 瓶颈:磁盘慢 / 日志多 / 慢 SQL。

4)锁竞争严重(sy 略高、us 一般、线程 BLOCKED 多)

特征

  • 锁等待多,CPU 不极端高,但应用极慢
  • BLOCKED 大量出现
  • 大量线程等待同一把锁:waiting to lock <0x...>

典型原因:synchronized 竞争、ReentrantLock 抢锁严重

一句话

大量 BLOCKED = 锁冲突,找占有锁的线程,优化锁粒度或无锁。

5)GC 频繁导致 CPU 飙高

特征

  • us 高,但不是业务线程
  • jstack 看到:VM ThreadGC task thread#0
  • jstat -gc 看到 YGC 每秒多次、FGC 频繁

原因:内存不足、大对象、内存泄漏

一句话

GC 线程占 CPU = 内存问题,不是业务代码死循环。

6)线程数过多导致 CPU 高

特征

  • sy 明显高
  • ps -eLf | grep java | wc -l 几千线程
  • 大量 TIMED_WAITING、WAITING
  • 频繁线程切换消耗内核 CPU

原因:线程池无限制、new Thread 滥用、定时任务太多

一句话

线程数过多 → sy 高、吞吐低,限制线程池核心线程数。

三、终极面试万能口诀(背这个就行)

  • us 高:死循环、计算密、GC 疯
  • sy 高:线程多、切换频、锁竞争
  • wa 高:IO 慢、磁盘忙、慢查询
  • BLOCKED 多:锁冲突
  • GC 线程高:内存炸
  • 线程几千:池无限
全部评论
可以的,写的很好呢
点赞 回复 分享
发布于 04-03 23:30 北京

相关推荐

04-04 14:34
门头沟学院 Java
本人双九硕,结合多份真实面经&nbsp;+&nbsp;大量候选人反馈,整理出字节跳动暑期实习面试避坑指南,全是从真实经历中总结的血泪教训,帮大家避开雷区、高效备战!先明确核心前提:字节暑期实习面试,核心考察项目经验、代码能力和实际场景应用,无过多八股,侧重真实能力与逻辑思维,以下是重点避坑点&nbsp;+&nbsp;注意事项,全程贴合真实面试场景。一、字节面试核心避坑点(重中之重!)1.面评有&nbsp;“记忆点”,且永久留存!字节的面试评分的是永久记录,所有面试官都能看到你的历史面评,哪怕换岗位、换账号投递,系统也会自动合并记录,一旦有负面评价(比如态度差、代码不过关),后续再投很难被捞。2.代码考察严格,避坑别踩雷!手撕代码是重点,高频考察无重复字符最长子串、第&nbsp;K&nbsp;大、LRU&nbsp;缓存、反转链表这&nbsp;4&nbsp;道题,多集中在一面;且会全程监控切屏(飞书可直接检测),千万别偷偷查答案,一旦被发现,直接挂掉。3.业务岗与研究岗差异大,别投错!业务岗侧重落地执行,代码要求更高;研究岗侧重算法深度,对论文和项目的考察更细致,选错方向会大幅降低通过率,投递前一定要确认岗位类型。4.别盲目&nbsp;“试错”,拒绝会影响后续!若拿到字节&nbsp;offer&nbsp;后又拒绝,短期内再投会被优先过滤;若只是想练手,建议先不投字节,避免留下&nbsp;“拒绝记录”,影响后续投递。5.基础不牢,再努力也白搭!无论是业务岗还是研究岗,都会重点考察基础算法和代码功底,哪怕项目经验丰富,基础题答不上来,也很难通过二面。二、高频踩坑场景(附避坑技巧)踩坑&nbsp;1:盲目投递,未区分岗位类型很多同学分不清字节业务岗和研究岗的区别,盲目投递后发现方向不匹配,面试时被问懵,白白浪费机会。建议投递前先确认岗位侧重(是侧重落地还是研究)。踩坑&nbsp;2:代码准备不充分,临时抱佛脚字节手撕代码难度高,且多考察&nbsp;ACM&nbsp;模式,若未提前刷&nbsp;Hot100、未熟悉&nbsp;ACM&nbsp;答题规范,大概率会在一面挂掉,建议提前针对性练习。踩坑&nbsp;3:面试时与面试官争执遇到观点分歧时,无需强行辩解,客观说明自己的思路即可,过度争执会降低面试官好感,直接影响面试结果。踩坑&nbsp;4:忽视&nbsp;HR&nbsp;面细节别以为技术面过了就稳了,HR&nbsp;面会重点了解你的稳定性和求职诚意,若表现出&nbsp;“只是练手”“不想长期发展”,很容易被刷。三、备考&nbsp;&amp;&nbsp;投递建议1.代码准备:重点刷&nbsp;Hot100&nbsp;高频题,尤其是字节常考的&nbsp;4&nbsp;道手撕题,练熟&nbsp;ACM&nbsp;答题格式,避免因格式问题丢分;2.项目&nbsp;&amp;&nbsp;论文:提前梳理自己的项目亮点和论文核心,面试时重点突出自己的贡献,避免泛泛而谈;3.投递节奏:字节暑期流程较快,建议集中投递,避免分散精力,投递后及时关注进度,避免错过面试通知;4.心态调整:面试时遇到不会的问题,坦诚说明即可,不要瞎编,面试官更看重你的学习态度和逻辑思维,而非完美答案。四、补充提醒字节暑期实习的核心门槛的是&nbsp;“能力匹配&nbsp;+&nbsp;稳定性”,若拿到&nbsp;offer&nbsp;后又拒绝,后续再投难度会大幅增加;另外,字节不喜欢&nbsp;“盲目试错”&nbsp;的候选人,投递前一定要明确自己的职业规划,避免浪费双方时间。后续会持续更新字节高频面试题、手撕代码技巧,助力大家顺利拿下字节暑期&nbsp;offer!
点赞 评论 收藏
分享
评论
2
25
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务