排查集群线上 CPU 飙高问题需要系统化的方法。以下是详细的排查思路:
1. 整体监控
- 监控工具:
- 使用 APM 工具(如 New Relic、Datadog、Prometheus)监控集群中的所有节点。
- 确定哪些节点的 CPU 使用率异常。
2. 节点级别分析
-
基础检查:
- 使用
top或htop查看具体哪个进程占用 CPU 高。 - 记录下高 CPU 使用的进程 ID (PID)。
- 使用
-
线程分析:
- 使用
top -H -p <PID>找出占用 CPU 最高的线程。 - 将线程 ID 转换为十六进制格式。
- 使用
3. Java 进程分析
-
线程堆栈:
- 使用
jstack <PID> > threaddump.txt获取线程堆栈。 - 查找高 CPU 使用的线程,分析其调用栈。
- 使用
-
垃圾回收:
- 使用
jstat -gc <PID>查看 GC 活动。 - 确保没有频繁的垃圾回收影响性能。
- 使用
-
内存使用:
- 使用
jmap -heap <PID>查看堆内存使用情况。 - 检查是否有内存泄漏或不合理的内存分配。
- 使用
4. 应用层面分析
-
代码分析:
- 检查最近的代码更改,特别是涉及高计算量的部分。
- 确认是否有死循环或过度同步的问题。
-
配置检查:
- 检查 JVM 参数配置,确保适合当前工作负载。
5. 集群层面分析
-
负载均衡:
- 确保负载均衡器正常工作,没有将过多请求分配到某个节点。
-
网络问题:
- 使用
iftop或nload检查网络流量,确保没有网络瓶颈。
- 使用
6. 外部因素
-
安全检查:
- 检查是否有恶意攻击,如 DDoS 导致的资源消耗。
-
第三方服务:
- 确认依赖的外部服务是否正常工作,没有导致请求积压。
7. 日志分析
-
应用日志:
- 检查应用日志中是否有异常或错误信息。
-
系统日志:
- 查看系统日志,查找可能影响性能的事件。
通过这些步骤,可以系统地排查集群中导致 CPU 飙高的问题,并采取相应措施进行优化和修复。