查看系统状态
使用工具如top、htop、ps等查看当前系统中各个进程的 CPU 使用情况,确认是哪个进程导致 CPU 飙升。
查看进程类型
确定该进程是业务进程、系统进程还是其他类型。如果是业务进程,进一步确认是哪个服务的进程。
- 使用 ps aux 列出所有进程的详细信息
- Linux 系统中,每个进程的信息都存储在
/proc/<pid>目录中。使用 cat 查看/proc 目录
查看该进程的日志
了解是否有异常日志信息,比如频繁的错误、异常的请求等。
tail -f /var/log/<process_log_file>
定位进程的线程
找到进程 ID(PID)
ps -ef | grep <进程名>
显示进程的所有线程
使用
ps -L选项可以显示指定进程的所有线程
查看负载情况
检查是否有异常的流量涌入,导致进程负载过高。如果是由于流量过高导致的 CPU 飙升,可以尝试对流量进行控制,比如使用限流工具(如nginx的限流模块、iptables等)减少进入该服务的流量。
紧急处理
-
优先级调整:如果进程是业务进程且不能立即停止,可以尝试降低该进程的优先级,使用
nice或renice命令,减少其对 CPU 的占用,从而让其他服务能够正常运行。1renice -n 10 -p <pid> -
临时隔离:如果该进程是某个服务的实例,可以尝试将该实例从负载均衡中移除,让其他正常实例继续提供服务。
详细排查
-
火焰图分析:使用火焰图工具(如
perf、flamegraph等)分析进程的 CPU 使用情况,找到具体的瓶颈点。1 2sudo perf record -g -p <pid> sudo perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg -
代码分析:根据火焰图的分析结果,定位到具体的代码位置,查看是否有逻辑问题,如死循环、高复杂度算法等。
-
依赖检查:检查该进程是否依赖了其他服务或资源,是否存在依赖服务响应慢导致的阻塞。
恢复与优化
- 恢复服务:如果经过分析确认该进程确实有问题且无法快速修复,可以考虑重启该进程,但在此之前确保有备份和回滚方案。
- 优化代码:根据分析结果,对代码进行优化,减少 CPU 使用。
- 资源扩展:如果是因为资源不足导致的 CPU 飙升,可以考虑增加服务器资源,如 CPU、内存等。
火焰图
火焰图工具不是 linux 自带的,需要下载安装。
安装 perf 工具
perf 是 Linux 系统中用于性能分析的工具,通常可以通过包管理器安装。
下载和安装 FlameGraph 工具
FlameGraph 是由 Brendan Gregg 开发的工具集,用于将 perf 的输出转换为火焰图。
生成火焰图
- 使用
perf record命令捕获性能数据。例如,以下命令会在 60 秒内从所有 CPU 和进程生成性能样本:
perf record -a -g -F 99 sleep 60
-a:从所有 CPU 捕获数据。
-g:启用调用图收集。
-F 99:每秒采样 99 次。
sleep 60:运行 60 秒后停止捕获。2. 将性能数据转换为文本格式
perf script > data.perf
- 生成 SVG 格式的火焰图
使用
flamegraph.pl脚本生成 SVG 格式的火焰图
