Administrator
发布于 2025-11-08 / 2 阅读
0
0

pref 性能分析工具

perf

是Linux系统中功能全面的性能分析框架,用于性能调优、问题诊断、性能瓶颈分析和系统行为跟踪,支持CPU、内存、磁盘、网络等多维度性能数据采集,是Linux性能工程师和开发人员的核心工具集。

使用 perf 工具需要安装,核心依赖 linux-tools-common(通用工具包)和与当前内核版本匹配的 linux-tools-$(uname -r)(内核工具包)。

# Ubuntu/Debian 系列
sudo apt install -y linux-tools-common linux-tools-$(uname -r)

# CentOS 7/RHEL 7
sudo yum install -y perf

# CentOS 8/RHEL 8 及以上(用 dnf 替代 yum)
sudo dnf install -y perf

# 验证安装
perf --version

perf top

perf工具集下的实时CPU热点采样工具,通过周期性采集CPU指令执行数据,按占比排序展示系统或指定进程中消耗CPU最多的函数、模块(内核态/用户态),核心作用是快速定位CPU使用率过高的根源(如异常进程、热点函数、内核瓶颈),无需修改应用代码,是运维和开发排查CPU性能问题的核心工具。

perf top [选项]

img

核心输出列详解

列名

含义与分析逻辑

示例与解读

Overhead

该函数/模块在采样周期内占用的CPU时间比例,数值越高优先级越高。

图中8.70%表示_raw_spin_unlock_irqrestore函数占用了8.7%的CPU时间,若占比持续过高需优先优化。

Shared Object

函数所属的共享库、内核模块或可执行文件,用于区分开销来自内核、系统库还是应用程序。

[kernel]表示内核函数;libc-2.17.so表示GNU C库函数;nginx表示应用程序自身函数。

Symbol

消耗CPU时间的具体函数或符号,是定位代码级瓶颈的关键。

_raw_spin_unlock_irqrestore(内核锁操作函数,占比高可能存在锁竞争);__memset_sse2(内存填充函数,占比高可能源于频繁内存初始化)。

常用选项

  • -p <pid>:"process",仅分析指定进程ID(PID)的CPU占用,聚焦单个异常进程。

    示例:若top发现PID为1234的进程CPU占比90%,执行perf top -p 1234,可单独分析该进程的热点函数。

  • -g:"call graph",生成函数调用栈(调用关系链),展示高CPU函数的上层调用者,便于追溯问题触发链路。

    示例:perf top -p 1234 -g,可查看进程1234中热点函数的调用来源,如“process_data_loopmain_loopmain”,快速定位代码逻辑中的触发点。

  • -k <vmlinux>:"kernel",指定内核符号表文件路径,用于解析内核态函数名(避免仅显示内存地址)。

    示例:perf top --kernel -k /usr/lib/debug/lib/modules/$(uname -r)/vmlinux,可正确显示内核中net_rx_action(网络收包处理函数)等热点函数,便于排查内核级瓶颈。

  • -d <n>:"delay",设置采样间隔(单位:秒),默认0.5秒。

    示例:perf top -d 2,每2秒刷新一次结果,降低高频采样对生产环境的性能影响。

  • -s <field>:"sort",按指定字段排序,调整输出展示逻辑,常用字段:

    • comm:按进程名排序,直观对比各进程CPU占比;

    • pid:按进程ID排序,快速关联top命令找到的异常PID;

    • dso:按模块名(如nginxkernellibc.so)排序,区分开销来源;

      示例:perf top -s comm,按进程名排序展示CPU占比,快速识别“哪个应用最耗CPU”。

参考示例

  • 示例1:系统级CPU热点排查

    执行perf top,输出如下:

      7.00%  [kernel]          [k] raw_spin_unlock_irqrestore
      3.81%  [libaqutil.so.1]  [.] std::fill_n<...>
      3.01%  [kernel]          [k] copy_user_enhanced_fast_string

    解读:内核自旋锁函数raw_spin_unlock_irqrestore占比最高,需排查是否存在内核锁竞争(如多CPU场景下频繁的同步操作);libaqutil.so中的C++标准库函数占比次之,需分析该库对应的应用逻辑是否存在循环或低效算法。

  • 示例2:单进程CPU瓶颈定位(结合-p-g

    top显示PID为5678myapp进程CPU占比持续90%,执行:

    perf top -p 5678 -g

    输出可能如下:

      45.23%  myapp  myapp             [.] process_data_loop
                 |
                 --- process_data_loop
                     |
                     --- main_loop
                         |
                         --- main
      28.11%  libstdc++.so.6    [.] std::vector<...>::push_back

    结论:myappprocess_data_loop函数是CPU热点,且由main_loop调用,需检查该函数是否存在死循环或低效算法(如未优化的循环逻辑)。

  • 示例3:内核热点函数解析(结合-k

    perf top显示内核模块占比高但函数名是内存地址,执行:

    perf top --kernel -k /usr/lib/debug/lib/modules/$(uname -r)/vmlinux

    输出可正确显示内核函数名:

      12.5%  [kernel]  [k] net_rx_action
      8.3%   [kernel]  [k] __softirq_entry

    结论:内核网络收包处理函数net_rx_action占比高,可能存在网络包风暴或网卡驱动性能问题,需结合网络流量和驱动版本进一步排查。

注意

  1. 执行perf命令通常需要root权限(或普通用户需配置perf_event权限),生产环境建议用sudo执行,例如sudo perf top

  2. 若输出中函数名显示为内存地址(而非符号),需确认是否安装了对应模块的调试符号包(如内核调试包、应用的debug版本),或通过-k选项指定符号表路径。

  3. 排查到热点函数后,需结合代码逻辑或模块文档进一步分析(如内核函数可查Linux源码,应用函数需查看业务代码),才能最终定位性能瓶颈的根因。


评论