某服务器CPU使用率达到99%,排查是哪个程序哪个线程导致的高CPU

思路:

1、先找到耗CPU高的进程;

2、找到耗CPU高的线程;

3、找到耗CPU高的线程对应的业务代码;

操作:

1.1、执行“top -c”命令,显示进程运行信息列表,键入大写P,按CPU使用率降序排列:

1.2、获取到进程PID为10765的进程,使用CPU资源最高19.9%;

至此,已找到耗CPU最高的进程,进程PID10765,后续命令中需要使用到。

 

2.1、一个进程内有很多线程,执行“top -Hp 10765”,显示进程ID10765线程列表,键入大写P后,按CPU使用率降序排列:

2.2、其中,PID为10804线程,CPU使用率最高2.3%;

2.3、将线程ID(10804)按16进制展示,执行指令“printf "%x\n" 10804”:

至此,找到了CPU使用率最高的线程ID10804,并获取到1080416进制标识:2a34

(转为16进制,是因为jstack打印出的线程栈信息中,线程id是通过16进制展示的)

 

3.1、通过jstack检索到进程(进程ID=10765)中,最耗CPU的线程(线程ID=2a34)的线程栈信息;

执行指令“jstack 10765 | grep "2a34" -C5 --color”

至此,找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”,而这个线程名称是我们业务代码中给线程取的名称,可以快速定位到业务代码。

tips:给线程取一个与业务处理相关的名称,对快速定位问题尤为重要。

如果我们没有给线程取名称“AsyncLogger-1”,那打印出来的线程名称可能是:

通过不知名的线程名称“pool-5-thread-1”,以及只包含jdk代码的线程栈信息,我们无法定位到业务代码。

 

<think>嗯,用户问的是“面试官cpu100怎么排除的讲解一下”,首先我需要明确问题。这里的“cpu100”应该是指CPU使用率达到100%的情况。用户可能是在面试中被问到如何排查和解决CPU使用率的问题,所以需要详细讲解排查步骤和方法。 首先,我得回忆一下常见的CPU使用率的原因,比如死循环、无限递归、频繁的GC、线程竞争、并发请求、算法复杂度等。然后,排查步骤通常包括定位问题进程、线程,分析线程栈,找出具体代码或资源问题。 接下来,用户可能作为面试者,需要展示系统化的排查思路。我应该分步骤说明,比如使用top命令找到占用的进程,再用top -Hp查看线程,把线程ID转成16进制,然后结合jstack或者pstack获取线程堆栈,分析代码。如果是Java应用,可能需要用到jstack、VisualVM等工具。对于其他语言,比如Python、Go,工具可能不同,但思路类似。 还要考虑不同操作系统,比如Linux和Windows下的工具差异。比如Linux下用top,perf,Windows下用任务管理器,Process Explorer等。此外,可能需要检查系统日志,应用日志,监控工具的数据,比如Prometheus、Grafana。 用户可能需要具体的命令示例,比如如何用ps、jstack,或者如何分析线程状态。例如,使用jstack导出线程快照,用grep查找对应nid,查看线程在做什么操作。如果是死循环,线程可能一直处于RUNNABLE状态,执行某个循环方法。 另外,可能需要提到一些优化方法,比如优化算法,减少锁竞争,调整线程池参数,增加硬件资源等。但重点在于排查过程,所以详细步骤更重要。 还要注意回答结构清晰,分步骤说明,每个步骤的工具和目的。比如第一步确定CPU进程,第二步定位线程,第三步分析线程堆栈,第四步结合日志和代码定位问题,第五步解决和验证。 需要确保提到的工具和命令准确,比如top的用法,如何转换线程ID为十六进制,jstack的使用,可能还要提到strace、perf等更底层的工具,或者像Arthas这样的Java诊断工具。 可能还需要区分不同的场景,比如如果是数据库问题,可能需要检查慢查询;如果是应用问题,检查代码逻辑。同时,考虑多线程和并发问题,比如线程阻塞、锁竞争导致CPU。 还要注意避免错误,比如线程ID转换是否正确,工具的使用是否恰当。比如在Java中,jstack的线程ID是十六进制的,而top显示的是十进制,所以需要转换。 最后,总结一下排查流程,强调方法论的重要性,而不仅仅是具体命令,这样面试官会觉得候选人思路清晰,有系统化解决问题的能力。</think>排查服务器CPU使用率100%的问题需要系统化分析,以下是分步骤解决方案: 一、快速定位问题进程 1. 使用top命令(Linux) ```bash top -c # 按CPU排序,显示完整命令 ``` 观察`%CPU`列找到异常进程,记录PID(进程ID) 2. 进阶工具选择 ```bash htop # 交互式进程查看器 pidstat 1 5 # 每秒采样一次,共5次 ``` 二、定位问题线程 ```bash top -Hp [PID] # 查看指定进程的线程 ps -T -p [PID] # 显示线程详情 ``` 记录CPU线程的LWP(线程ID) 三、线程堆栈分析 1. 十进制转十六进制(Java线程需要) ```bash printf "%x\n" [LWP] # 得到nid值 ``` 2. 获取线程堆栈 ```bash # Java应用 jstack [PID] > thread_dump.log # C/C++应用 gdb -p [PID] thread apply all bt # Python应用 py-spy dump --pid [PID] ``` 四、常见模式分析 1. 死循环特征 - 线程持续处于RUNNABLE状态 - 堆栈显示循环调用(如while(true)) 2. 锁竞争特征 - 大量线程处于BLOCKED状态 - 堆栈显示在monitor enter处等待 3. GC过载特征 - 多GC线程高负载 - 配合jstat查看GC情况: ```bash jstat -gcutil [PID] 1000 ``` 五、级诊断工具 1. Java生态 ```bash arthas # 在线诊断工具 jcmd [PID] VM.native_memory # 内存分析 ``` 2. 系统级分析 ```bash perf record -F 99 -p [PID] -g -- sleep 30 perf report # 查看函数级CPU消耗 strace -p [PID] # 跟踪系统调用 ``` 六、典型解决方案 1. 代码层面 - 优化死循环增加退出条件 - 降低算法时间复杂度(O(n²)→O(n)) - 减少锁粒度或用无锁数据结构 2. 配置优化 - 调整线程池大小 - 增加JVM堆内存 - 优化GC策略 3. 架构层面 - 增加限流熔断机制 - 实施负载均衡 - 热点数据缓存 七、验证环节 优化后需进行: 1. 压力测试(JMeter/LoadRunner) 2. 持续监控(Prometheus+Grafana) 3. 性能对比(优化前后CPU对比) 关键要点: 1. 80%的问题可通过堆栈分析定位 2. 注意区分用户CPU与系统CPU(us% vs sy%) 3. 结合内存/IO指标综合判断 4. 容器环境需进入Pod诊断 此方法论适用于大多数服务端CPU问题排查,实际应用中需结合具体日志和业务场景分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值