Perf使用详解

Perf 工具深度解析

Perf(Performance Counters for Linux)是 Linux 系统的性能分析工具,基于内核的 perf_event 子系统,通过硬件性能计数器(PMC)、软件事件和跟踪点(tracepoints)实现全方位性能监控。


一、工作原理与实现机制

1. 核心组件
组件作用
硬件性能计数器利用 CPU 的 PMU(Performance Monitoring Unit)统计指令周期、缓存命中/失效等事件。
软件事件内核插桩统计上下文切换、缺页异常等软件行为(如 context-switches)。
跟踪点静态内核探针(如 sched:sched_switch),记录特定代码路径的执行信息。
kprobes/uprobes动态内核/用户空间探针,支持自定义函数级跟踪。
2. 数据采集流程
+----------------+       +-------------------+       +-----------------+
| 配置事件        | ----> | perf_event_open() | ----> | 内核事件子系统   |
| (cycles, cache |       | (系统调用)        |       | (PMU/软件计数器) |
| misses, etc.)   |       +-------------------+       +-----------------+
+----------------+                     |v
+------------------+     mmap()      +--------------+
| 用户空间工具      | <------------- | 环形缓冲区     |
| (perf record/stat)|                 | (存储样本)    |
+------------------+                 +--------------+
3. 关键机制
  • 环形缓冲区:采样数据通过无锁环形缓冲(避免系统调用开销)传递到用户空间。
  • 采样模式
    • 计数模式:累计事件发生次数(perf stat)。
    • 中断采样:事件达到阈值时触发中断,记录指令指针/IP(perf record)。
  • 符号解析:通过 /proc/kallsyms 或 ELF 文件将地址映射为函数名。

二、命令大全与使用示例

1. 常用命令总结
命令功能常用选项
perf stat统计事件发生的绝对次数-e (指定事件), -p (PID), -a (全局)
perf record采样并保存数据到 perf.data-g (调用栈), -F (采样频率), -o (输出文件)
perf report解析 perf.data 生成报告--stdio (文本报告), -n (显示样本数)
perf top实时显示热点函数-e (事件), -K (隐藏内核符号)
perf list列出支持的事件--details (显示事件详情)
perf script导出采样数据为脚本格式-i (输入文件), -F (自定义字段)
perf trace类似 strace,跟踪系统调用-p (PID), -e (过滤系统调用)
perf annotate汇编代码级注解--stdio (文本模式), -s (符号)
2. 详细示例

Perf 典型使用场景及命令详解

2.1 CPU 性能分析
场景命令示例说明
CPU 热点函数分析perf top -e cycles -p <PID>实时查看进程的热点函数
调用链分析perf record -F 99 -g -p <PID> -o perf.data; perf report --stdio记录调用栈并生成文本报告
多核负载均衡分析perf stat -e sched:sched_migrate_task -a sleep 10监控任务在 CPU 核间的迁移情况
IPC 指标分析perf stat -e cycles,instructions -p <PID> -- sleep 5计算指令/周期比 (IPC = instructions/cycles)

示例:CPU 瓶颈诊断

# 1. 查找 CPU 占用最高的进程
perf top# 2. 对高负载进程 (PID 1234) 进行采样
perf record -F 997 -g -p 1234 -o cpu_hotspot.data -- sleep 30# 3. 生成带调用栈的报告
perf report -i cpu_hotspot.data --stdio --no-children

输出片段

# Overhead  Command  Shared Object     Symbol
# ........  .......  ................  ................................
#62.15%  nginx    nginx             [.] ngx_http_process_request|---ngx_http_process_request|          |--45.32%-- ngx_http_core_content_phase|          ngx_http_proxy_handler|          ||          |--38.71%-- ngx_http_upstream_connect|          |          __connect

2.2 内存子系统分析
场景命令示例说明
缓存命中率分析perf stat -e cache-references,cache-misses <command>统计 L1/L2/L3 缓存效率
内存带宽分析perf stat -e uncore_imc_0/cas_count_read/,uncore_imc_0/cas_count_write/监控 DDR 内存读写带宽 (需 Intel PMU)
缺页异常分析perf stat -e page-faults,minor-faults,major-faults -p <PID>区分次/主缺页异常

示例:内存敏感型应用优化

# 1. 检测缓存效率
perf stat -e \L1-dcache-load-misses,LLC-load-misses,dTLB-load-misses \./memory_intensive_app# 2. 输出结果35,421,632  L1-dcache-load-misses     #  12.45% of all L1-dcache hits  8,765,432  LLC-load-misses           #   3.21% of all LL-cache hits1,234,567  dTLB-load-misses          #   0.45% of all dTLB cache hits

2.3 I/O 性能分析
场景命令示例说明
块设备 I/O 延迟perf record -e block:block_rq_issue,block:block_rq_complete -a跟踪块设备请求生命周期
文件系统操作跟踪perf record -e ext4:*,xfs:* -a捕获特定文件系统事件
系统调用分析perf trace -e 'read,write,openat' -p <PID>监控文件相关系统调用

示例:磁盘 I/O 瓶颈诊断

# 1. 跟踪块设备事件
perf record -e block:block_rq_issue -e block:block_rq_complete -a# 2. 生成延迟报告
perf script | awk '/block_rq_issue/{ts[$5]=$4}/block_rq_complete/{if(ts[$5])printf "%.2f ms\n", ($4-ts[$5])*1000}'

输出

8.23 ms  # I/O 请求延迟
12.45 ms
5.67 ms

2.4 网络性能分析
场景命令示例说明
网络协议栈跟踪perf record -e skb:kfree_skb -e net:net_dev_xmit -a监控丢包和发送事件
TCP 函数跟踪perf probe --add tcp_v4_connect; perf record -e probe:tcp_v4_connect动态跟踪 TCP 连接建立
网络延迟分析perf trace -e sendto,recvfrom -p <PID> -T跟踪网络收发系统调用时间戳

示例:网络丢包分析

# 1. 创建丢包检测探针
sudo perf probe --add 'kfree_skb reason'# 2. 记录丢包事件
sudo perf record -e probe:kfree_skb -aR -o net_drop.data# 3. 分析丢包原因
sudo perf script -i net_drop.data | awk '{print $5}' | sort | uniq -c | sort -nr

输出

 1423 TCP: Too many orphaned sockets890 NETDEV WATCHDOG: enp0s3 transmit timeout321 ICMP: Destination unreachable

2.5 锁与同步分析
场景命令示例说明
锁竞争分析perf record -e lock:lock_acquire -e lock:lock_release -g -p <PID>跟踪锁获取/释放事件
调度延迟分析perf sched record -p <PID>; perf sched latency分析任务调度延迟
中断分析perf record -e irq:irq_handler_entry -e irq:irq_handler_exit -a跟踪中断处理时间

示例:锁竞争诊断

# 1. 记录锁事件
perf record -e lock:lock_acquire -e lock:lock_release -g -p 5678 -o locks.data# 2. 生成竞争报告
perf lock report -i locks.data --combine-locks --sort contended

输出

                Name   acquired  contended   avg wait (ns)
----------------------------------------------------------
&sb->s_type->i_lock    14235      4231        15234&rq->lock      8765       2109         8765mm->page_table_lock 6543     987          5432

2.6 火焰图生成
perf record -F 99 -a -g -- sleep 30
perf script > out.perf
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > flame.svg
2.7 Perf 工作流程图
CPU 瓶颈
内存瓶颈
I/O 瓶颈
网络问题
锁竞争
确定分析目标
性能问题类型
perf record/top
perf stat -e cache
perf trace -e block
perf probe + net events
perf lock
生成火焰图/报告
缓存命中率报告
I/O 延迟直方图
丢包原因统计
锁竞争分析
优化热点函数
调整数据布局
优化 I/O 模式
调整网络参数
减少锁粒度

2.8 高级技巧
  1. PEBS 精确采样

    perf record -e cycles:pp -c 1000000 -p <PID>  # 每100万周期采样一次
    
  2. 事件分组统计

    perf stat -e '{cycles,instructions,branch-misses}' -r 5 ./program
    
  3. 时间戳跟踪

    perf record -e sched:sched_switch -T -a -- sleep 10
    perf script --ns
    
  4. 跨进程跟踪

    perf record -e 'sched:sched_wakeup,sched:sched_switch' -a
    
  5. 用户空间探针

    perf probe -x /path/to/bin 'func_name'
    perf record -e probe_bin:func_name -a
    

三、Perf 使用流程图

计数模式
采样模式
实时模式
动态跟踪
启动分析
选择模式
perf stat
perf record
保存到 perf.data
perf report/report
生成文本/图形报告
perf top
perf probe + record
perf script 分析日志
优化代码/系统

四、高级技巧

  1. 事件修饰符
    • u:仅用户空间,如 perf stat -e cycles:u
    • k:仅内核空间
  2. 精确采样
    perf record -e cycles:pp -p 1234  # 使用 PEBS 精确采样
    
  3. 多事件分析
    perf stat -e cycles,instructions,cache-references,cache-misses ls
    

五、注意事项

  • 权限要求:部分事件需要 CAP_PERFMONroot 权限。
  • 符号表:用户程序需编译时添加 -g 选项(保留调试符号)。
  • 内核版本:不同内核版本支持事件可能不同(perf list 查看)。

通过灵活组合命令,Perf 可定位 CPU 瓶颈、内存延迟、I/O 问题等,是 Linux 性能调优的核心工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93427.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windchill 11 Enumerated Type Customization Utility-枚举类型自定义实用程序

一、Enumerated Type Customization Utility 枚举类型自定义实用程序&#xff0c;可用于添加或编辑枚举类型的值&#xff0c;在Windchill 12.0中可直接在类型和属性管理中编辑&#xff0c;如下图所示&#xff0c;而在Windchill 11.0中只能通过windchill shell启动程序&#xff…

git疑问,暂时记录

有时候把dev本地分支搞乱了,多出几个提交,好像在远程仓库,rebase dev到本地dev,就恢复了,然后再把我开发分支合并过去就ok,就不会多出几个重复的提交 在自己分支开发提交数据后,不push到远程仓库 然后合并到dev分支,推dev分支到远程仓库然后在自己分支,rebase到自己分支,然后再…

Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害预警与应急响应中的应用

Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害预警与应急响应中的应用引言&#xff1a;Java 筑起气象防灾减灾的数字长城正文&#xff1a;Java 构建的气象智慧防御体系一、气象大数据的 Java 基座&#xff1a;从采集到存储的全链路优化1.1 多源异构数据的实时汇聚1.2…

MySQL黑盒子研究工具 strace

strace是什么&#xff1f; 按照 strace 官网的描述, strace 是一个可用于诊断、调试和教学的 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互&#xff0c;比如系统调用、信号传递、进程状态变更等。 strace 底层使用内核的 ptrace 特性来实现其功能。 strace能…

【运维进阶】实施任务控制

实施任务控制 在 Ansible 中&#xff0c;“实施任务控制” 通常指的是对任务执行流程的控制&#xff0c;比如&#xff1a; 条件执行&#xff08;when&#xff09; 循环执行&#xff08;with_items / loop&#xff09; 错误处理&#xff08;block / rescue / ignore_errors&…

Java 中的线程中断详解

Java 中的线程中断1、什么是线程中断2、如何触发线程中断3、如何处理线程中断3.1 线程中断相关的核心方法3.2 处理中断的典型方式3.3 注意事项4、线程中断与线程终止的区别5、线程中断的应用场景5.1 长时间运行任务的取消5.2 阻塞操作的快速响应5.3 服务或线程池的优雅关闭5.4 …

【LeetCode题解】LeetCode 33. 搜索旋转排序数组

【题目链接】 33. 搜索旋转排序数组 【题目描述】 【题解】 对于一个有序数组&#xff0c;我们可以使用二分查找算法来查找某个元素&#xff0c;具体的算法模板可以参考【算法基础课-算法模板1】基础算法中二分查找一节的内容。 然而&#xff0c;在这道题目中&#xff0c;数组…

使用 Serverless 架构快速构建基于 Iceberg 的事务型实时数据湖

文章目录1. 背景介绍2. 架构设计3. 方案实现3.1 CDC3.1.1 自定义插件3.1.2 配置 MSK Connect3.2 实时摄入3.2.1 Glue 实现方案3.2.1.1 在 Glue 中创建 Kafka connection3.2.1.2 Glue Streaming 任务3.2.2 EMS Serverless 实现方案3.3 使用 Athena 查询 Iceberg 表3.3.1 查询3.3…

Java零基础笔记20(Java高级技术:单元测试、反射、注解、动态代理)

1.单元测试2.反射2.1 反射第一步&#xff1a;加载类&#xff0c;获取类的字节码&#xff0c;class对象2.2 获取类中的成分&#xff08;构造器、成员变量、成员方法&#xff09;&#xff0c;并对其进行操作获取构造器的作用&#xff1a;获取成员变量的作用&#xff1a;获取成员…

WinDbg 调试

安装 Windows 调试器 WinDbg 是一种调试器,可用于分析故障转储、调试实时用户模式和内核模式代码,以及检查 CPU 寄存器和内存。 此最新版本具有更新的界面、完全现成的脚本功能、可扩展的调试数据模型、内置的时间旅行调试(TTD)支持和许多其他功能,具有更现代的用户体验。…

topographic terrain

在中文语境中&#xff0c;topographic&#xff08;地形学&#xff09;和 terrain&#xff08;地形&#xff09;这两个词都与地表特征相关&#xff0c;但它们的含义和使用场景有细微差别。以下是它们的区别&#xff1a; 1. 定义Topographic&#xff08;地形学的&#xff09;&…

SpringCloud 06 服务容错 Sentinel

雪崩&#xff1a;一个微小的故障引起系统其他部分出现故障&#xff0c;最终使整个系统不可用。 雪崩一般经历以下三个阶段&#xff1a; 实例能力出现过载。可能是 bug 导致性能下降&#xff0c;可能是实例宕机&#xff0c;可能是突发流量&#xff0c;总之实例无法处理如此多请求…

Qt同步处理业务并禁用按钮

1.界面代码 //按钮1 void Dialog::on_pushButton1_clicked() {qDebug("pushButton1 clicked start");enableBtns(false);//禁用按钮qDebug("pushButton1 do sth start");QThread::sleep(5);//休眠&#xff0c;作为同步处理业务qDebug("pushButton1 do…

虚拟专用网技术

一、需求背景物理联通&#xff1a;实现不同物理位置网络的连接基础。网络联通&#xff1a;在物理连接基础上&#xff0c;实现数据等信息的传输互通。二、虚拟专用网简介定义虚拟私有网络是依靠互联网服务提供商&#xff08;ISP&#xff09;或其他网络服务提供商&#xff08;NSP…

GANs生成对抗网络生成手写数字的Pytorch实现

目录 一、第三方库导入 二、数据集准备 三、使用转置卷积的生成器 四、使用卷积的判别器 五、生成器生成图像 六、主程序 七、运行结果 7.1 生成器和判别器的损失函数图像 7.2 训练过程中生成器生成的图像 八、完整的pytorch代码 由于之前写gans的代码时&#xff0c;…

ubuntu 通过NAT模式上网

这里必须使用VMnet8 设置为NAT模式 下面设置Ip地址区域ubuntu ip地址设置来自于上面

盲盒抽谷机小程序系统开发:从0到1的完整方法论

开发一款成功的盲盒抽谷机小程序系统&#xff0c;需兼顾技术实现、用户体验与商业逻辑。本文将从需求分析、UI/UX设计、技术架构、测试上线到运营增长&#xff0c;系统梳理从0到1的完整方法论。需求分析&#xff1a;明确“为谁而做”盲盒抽谷机的核心用户是18-35岁的二次元爱好…

web开发,在线%射击比赛管理%系统开发demo,基于html,css,jquery,python,django,三层mysql数据库

经验心得 两业务单&#xff0c;业务crud开发很简单了&#xff0c;自行学习&#xff0c;我说一下学习流程。什么是前端&#xff0c;用到那些技术html,css,javascript分别是什么&#xff1f;进阶jquery,bootstrap,各种常见前端组件又是什么&#xff0c;前端框架react,angular以及…

Centos9傻瓜式linux部署CRMEB 开源商城系统(PHP)

服务器环境推荐要求* Nignx&#xff08;必须&#xff09; * PHP 7.1 ~ 7.4&#xff08;必须此版本内&#xff0c;版本过大会警告不兼容&#xff09; * MySQL 5.7 &#xff5e; 8.0&#xff08;必须&#xff09; * Redis&#xff08;非必须&#xff09;后台页面展示&#xff1a;…

AI 云电竞游戏盒子:从“盒子”到“云-端-芯”一体化竞技平台的架构实践

摘要 AI 云电竞游戏盒子&#xff08;以下简称“电竞盒”&#xff09;不再是一台简单的客厅游戏主机&#xff0c;而是一套以 AI 调度为核心、以云原生架构为骨架、以边缘渲染为肌肉、以端侧感知为神经的“云-端-芯”协同竞技系统。本文基于 2024 年 Q2 落地的量产方案&#xff0…