服务器CPU飙升该如何排查火焰图
查看系统状态
使用工具如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的占用,从而让其他服务能够正常运行。renice -n 10 -p <pid>
临时隔离:如果该进程是某个服务的实例,可以尝试将该实例从负载均衡中移除,让其他正常实例继续提供服务。
详细排查
火焰图分析:使用火焰图工具(如
perf
、flamegraph
等)分析进程的CPU使用情况,找到具体的瓶颈点。sudo 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
的输出转换为火焰图。
生成火焰图
1. 使用
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
3. 生成 SVG 格式的火焰图
使用
flamegraph.pl
脚本生成 SVG 格式的火焰图