# perf工具使用
# 基本介绍
Perf(Performance Counters for Linux,性能计数器子系统)
是一个Linux
性能分析工具,用于分析系统和应用程序的运行时性能。这个工具位于 Linux
内核源代码树中,具体位置在 tools/perf
目录下。虽然它是一个用户空间的应用程序,但却是唯一一个被包含在 Linux
内核源码中的复杂用户软件。
Perf
可以帮助开发人员和系统管理员进行函数级和指令级的热点查找,可以用来分析程序中热点函数的CPU
占用率,了解CPU
性能计数器、内核跟踪点和硬件事件等信息,从而找到性能瓶颈,优化软件性能并诊断问题。
通过 perf
命令,我们可以获得系统在运行过程中的各种性能数据,例如 CPU
利用率、内存使用情况、磁盘 I/O
等。perf
可以用于多个方面的性能分析,以下是一些常用的用途:
CPU
性能分析,通过perf
命令,可以监测CPU
的使用率、上下文切换次数、缓存命中率等指标,可以帮助开发者找出CPU
性能瓶颈,优化程序的运行效率。- 内存性能分析,
perf
命令可以监测内存的使用情况,例如内存泄漏、内存碎片等问题,可以帮助开发者优化内存的管理,提高系统的稳定性。 - 函数级别采样,
perf
可以对程序进行函数级别的采样,从而了解程序的性能瓶颈在哪里。其基本原理是每隔一个固定时间,CPU
会产生一个中断,记录当前是哪个进程、哪个函数,然后给对应的进程和函数加一个统计值,从而知道CPU
在某个进程或某个函数上花费了多少时间。
如果系统没有安装Perf
,安装方式为:
sudo apt install linux-tools-common linux-tools-generic
查看是否安装成功:
perf --version
# perf version 5.15.148
权限设置,默认运行perf
命令需要sudo
权限,可以通过修改/etc/sysctt.conf
文件进行设置
sudo vi /etc/sysctl.conf
# add line
kernel.perf_event_paranoid = 0
# perf
命令使用
命令格式为:
perf <options> subcommand <options/arguments>
perf
支持很多subcommand
选项,常用的子命令有:
annotate
读取perf.data
,展示带注释代码,实际使用发现展示的汇编代码
sudo perf annotate -f
# Percent│ xor %r15d,%r15d
# │ lea 0x9(%rsp),%rbp
# │ testb $0x3,0x90(%rsp)
# │ ↓ je 96
# │ swapgs
# │ nop
# │ xchg %ax,%ax
# │ mov %cr3,%rax
# │ bts $0x3f,%rax
# │ and $0xffffffffffffe7ff,%rax
# │ mov %rax,%cr3
# │ xchg %ax,%ax
# │ mov $0x48,%ecx
list
,展示perf
命令可以用来评估程序性能的事件
sudo perf list -h
# Usage: perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|metric|metricgroup|event_glob]
通过上面的命令可以查看事件类型,hw
是hardware
硬件相关事件,PMU
是Performance Monitoring Unit
相关事件等
record
,记录程序运行时的数据
sudo perf record -e cpu-clock -aR sleep 10
# [ perf record: Woken up 1 times to write data ]
# [ perf record: Captured and wrote 0.002 MB perf.data (~150 samples) ]
report
,展示perf
命令记录的数据
sudo perf report -i perf.data
stat
查看具体某个事件相关的统计结果
sudo perf stat -e cpu-clock -aR sleep 10
# Performance counter stats for 'sleep 10':
# 1.13 msec cpu-clock # 0.000 CPUs utilized
# 10.002228914 seconds time elapsed
# 0.001793000 seconds user
# 0.000000000 seconds sys
stat
和record
子命令的主要区别是record
会将结果保存到perf.data
文件中,而stat
是直接展示结果。
top
是直接展示整个系统的CPU
内存等使用情况script
读取perf.data
数据,并展示迹输出trace out
子命令 | 作用 |
---|---|
annotate | 汇编代码及注释 |
list | 查看所有事件 |
stat | 查看某事件相关的性能数据 |
record | 录制某事件相关的性能数据,并保存perf.data 文件 |
report | 加载perf.data 文件 |
top | 系统相关的性能数据 |
script | perf.data 相关的trace out |
使用perf
命令追踪一个正在运行的进程:
sudo perf stat --pid <pid>
# reference
1.https://phoenixnap.com/kb/linux-perf#:~:text=The%20Linux%20perf%20tool%20is,and%20analyzing%20CPU%20event%20data. (opens new window)
2.https://cloud.tencent.com/developer/article/2228048 (opens new window)