服务器CPU飙升该如何排查&火焰图

查看系统状态

使用工具如tophtopps等查看当前系统中各个进程的 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等)减少进入该服务的流量。

紧急处理

  • 优先级调整:如果进程是业务进程且不能立即停止,可以尝试降低该进程的优先级,使用nicerenice命令,减少其对 CPU 的占用,从而让其他服务能够正常运行。

    1
    
    renice -n 10 -p <pid>
    
  • 临时隔离:如果该进程是某个服务的实例,可以尝试将该实例从负载均衡中移除,让其他正常实例继续提供服务。

详细排查

  • 火焰图分析:使用火焰图工具(如perfflamegraph等)分析进程的 CPU 使用情况,找到具体的瓶颈点。

    1
    2
    
    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

  1. 生成 SVG 格式的火焰图

使用 flamegraph.pl 脚本生成 SVG 格式的火焰图

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计