后端场景面试题, 线上 CPU 飙高如何排查?
后端场景面试题, 线上 CPU 飙高如何排查?
QA
Step 1
Q:: 线上 CPU 飙高如何排查?
A:: 当线上系统的 CPU 使用率突然飙升时,排查问题的步骤包括:1.
使用 top
或 htop
命令查看系统资源的使用情况,找出占用 CPU 最多的进程;2.
使用 ps -aux
命令查看进程的详细信息,包括 PID、用户、CPU 占用率等;3.
使用 jstack
对 Java 应用进行线程栈分析,找出可能的热点线程;4.
如果是数据库导致的,可以查看慢查询日志或使用 explain
命令分析 SQL 性能问题;5.
检查应用程序的日志文件,查找可能的异常信息。最后,结合业务场景和最近的代码变更,逐步缩小排查范围。
Step 2
Q:: 如何通过 jstack
命令排查 CPU 高使用率问题?
A:: jstack
命令可以生成 Java 虚拟机(JVM)当前运行线程的堆栈信息。首先使用 top
命令找到占用 CPU 较高的 Java 进程,然后使用 ps -mp <PID> -o THREAD,tid,time
命令列出该进程下的线程信息,找到占用 CPU 较高的线程 TID。将 TID 转换为十六进制格式,再用 jstack <PID> | grep <0xTID>
命令定位该线程的堆栈信息,从中查找潜在的死循环或热点代码。
Step 3
Q:: 哪些因素会导致线上 CPU 飙高?
A:: 导致线上 CPU 飙高的因素可能包括:1. 代码中的死循环或无效循环;2. 频繁的垃圾回收(GC);3. 锁竞争严重,导致大量线程处于忙等待状态;4. 数据库慢查询或未优化的 SQL;5. 外部接口调用延迟,导致线程积压;6.
负载突增,导致资源不堪重负。
Step 4
Q:: 如何使用 perf
工具分析 CPU 性能问题?
A:: perf
是一个强大的 Linux 性能分析工具,可以用于采集系统的硬件性能数据。使用 perf top
可以实时查看系统中消耗 CPU 资源最多的函数或指令;使用 perf record
可以记录一段时间内的 CPU 性能数据,之后通过 perf report
生成分析报告,从中找出性能热点。