linux perf工具使用指导
perf
是 Linux 内核自带的性能分析工具,主要用于分析系统性能瓶颈和程序的性能问题。通过合理使用 perf
工具,可以有效地分析和优化系统性能。
安装 perf
在大多数 Linux 发行版中,perf
工具通常随内核源代码包一起提供。可以通过以下命令安装:
Ubuntu/Debian:
bash
sudo apt-get install linux-tools-$(uname -r)
CentOS/RHEL:
bash
sudo yum install perf
基本用法
perf帮助文档:
bash
]# perf --help
用法: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]
最常用的 perf 命令有:
annotate 读取 perf.data(由 perf record 创建)并显示带注释的代码
archive 创建包含在 perf.data 文件中找到的带有 build-id 的目标文件的归档文件
bench 基准测试套件的一般框架
buildid-cache 管理 build-id 缓存
buildid-list 列出 perf.data 文件中的 build-id
c2c 共享数据 C2C/HITM 分析器
config 获取和设置配置文件中的变量
data 数据文件相关处理
diff 读取 perf.data 文件并显示差异分析
evlist 列出 perf.data 文件中的事件名称
ftrace 内核 ftrace 功能的简单封装
inject 过滤器,用于在事件流中添加附加信息
kallsyms 在正在运行的内核中搜索符号
kmem 追踪/测量内核内存属性的工具
kvm 追踪/测量 KVM 客户操作系统的工具
list 列出所有符号事件类型
lock 分析锁事件
mem 内存访问分析
record 运行一个命令并将其性能数据记录到 perf.data 文件中
report 读取 perf.data(由 perf record 创建)并显示分析报告
sched 追踪/测量调度器属性(延迟)的工具
script 读取 perf.data(由 perf record 创建)并显示跟踪输出
stat 运行一个命令并收集性能计数器统计数据
test 运行完整性测试
timechart 可视化工作负载期间系统总体行为的工具
top 系统性能分析工具
version 显示 perf 二进制文件的版本
probe 定义新的动态跟踪点
trace 类似 strace 的工具
参见 'perf help COMMAND' 以获取有关特定命令的更多信息。
perf
提供了多种子命令,以下是一些常用的命令:
- 查看 CPU 性能计数器:
bash
perf stat <command>
该命令会运行指定的命令并显示其 CPU 性能统计信息。
- 记录性能数据:
bash
perf record -a
该命令会在系统上收集性能事件,-a
选项表示全局记录(包括所有 CPU)。该命令会在当前路径下生成perf.data
- 分析性能数据:
bash
perf report
该命令会显示 perf record
收集到的数据的分析报告。读取当前路径下的perf.data文件。
- 跟踪特定进程:
bash
perf trace -p <pid>
该命令会实时跟踪指定进程的系统调用。
实际应用场景
- 识别性能瓶颈:
使用 perf stat
监控程序的性能,以识别潜在的瓶颈,如 CPU 使用率、缓存命中率等。
- 函数级别性能分析:
使用 perf record
和 perf report
,分析函数执行的耗时,帮助定位慢函数。
- 系统调用跟踪:
使用 perf trace
跟踪特定进程的系统调用,以分析 I/O 性能和系统调用的开销。
示例
- 统计命令执行的性能:
bash
]# perf stat ls
anaconda-ks.cfg keys notation
ca.crt kubeconfig perf.data.old
cirros-0.5.2-x86_64-disk.img kubeconfig.kubemark perf-tests.tar.gz
cosign kubectl-ko pki
create_project_harbor.sh kubesphere pull-image-ceph.sh
download-etcd.sh kubesphere1-conf push-image-ceph.sh
go kubesphere2-1-conf registry2.7.tar
go1.22.4.linux-amd64.tar.gz kubesphere-argoproj.tar rook-ceph
harbor kuboard-spray-resource.tar sockperf-3.8.tar.gz
helm minio test-del.tar
ip_add.txt MrDoc trivy
iperf3-3.1.7-3.el7_9.x86_64.rpm myproject trivy_0.53.0_Linux-64bit.rpm
iperf3-tools.sh netperf-2.7.0.tar.gz trivy-db.tar.gz
k8s1.23.15-kubesphere3.4.1 nginx-ingress-controller.tag.gz
Performance counter stats for 'ls':
1.92 msec task-clock # 0.808 CPUs utilized
0 context-switches # 0.000 K/sec
1 cpu-migrations # 0.521 K/sec
261 page-faults # 0.136 M/sec
<not supported> cycles
<not supported> instructions
<not supported> branches
<not supported> branch-misses
0.002374917 seconds time elapsed
0.000000000 seconds user
0.002503000 seconds sys
- 记录整个系统的性能数据:
bash
]# perf record -a -g -- sleep 10
[ perf record: Woken up 26 times to write data ]
[ perf record: Captured and wrote 7.078 MB perf.data (59077 samples) ]
- 分析记录的数据:
bash
[root@harbor ~]# perf report
Samples: 59K of event 'cpu-clock', Event count (approx.): 14769250000
Children Self Command Shared Object Symbol
+ 96.81% 0.00% swapper [kernel.kallsyms] [k] start_cpu
+ 96.81% 0.01% swapper [kernel.kallsyms] [k] cpu_startup_entry
+ 96.65% 0.01% swapper [kernel.kallsyms] [k] arch_cpu_idle
+ 96.64% 0.01% swapper [kernel.kallsyms] [k] default_idle
+ 96.25% 96.25% swapper [kernel.kallsyms] [k] native_safe_halt
+ 69.10% 0.00% swapper [kernel.kallsyms] [k] start_secondary
+ 27.71% 0.00% swapper [kernel.kallsyms] [k] x86_64_start_kernel
+ 27.71% 0.00% swapper [kernel.kallsyms] [k] x86_64_start_reservations
+ 27.71% 0.00% swapper [kernel.kallsyms] [k] start_kernel
+ 27.71% 0.00% swapper [kernel.kallsyms] [k] rest_init
0.39% 0.00% swapper [kernel.kallsyms] [k] irq_exit
0.39% 0.00% swapper [kernel.kallsyms] [k] do_softirq
0.39% 0.00% swapper [kernel.kallsyms] [k] call_softirq
0.38% 0.07% swapper [kernel.kallsyms] [k] __do_softirq
0.32% 0.00% swapper [kernel.kallsyms] [k] apic_timer_interrupt
0.32% 0.00% swapper [kernel.kallsyms] [k] smp_apic_timer_interrupt
0.32% 0.00% containerd-shim containerd-shim-runc-v2 [.] 0x000000000046b6c1
0.28% 0.00% runc [kernel.kallsyms] [k] async_page_fault
0.28% 0.00% runc [kernel.kallsyms] [k] do_async_page_fault
0.28% 0.00% runc [kernel.kallsyms] [k] trace_do_page_fault
0.28% 0.03% runc [kernel.kallsyms] [k] __do_page_fault
0.28% 0.00% runc runc [.] runtime.goexit.abi0
0.26% 0.00% runc runc [.] runtime.main
0.25% 0.01% runc [kernel.kallsyms] [k] handle_mm_fault
0.23% 0.00% runc [kernel.kallsyms] [k] native_flush_tlb_others
0.22% 0.00% containerd-shim containerd-shim-runc-v2 [.] 0x00000000004698ca
0.22% 0.21% runc [kernel.kallsyms] [k] smp_call_function_many
0.18% 0.00% containerd-shim containerd-shim-runc-v2 [.] 0x000000000087eeeb
0.17% 0.00% containerd-shim [kernel.kallsyms] [k] system_call_fastpath
0.16% 0.00% runc [kernel.kallsyms] [k] do_wp_page
0.16% 0.00% runc [kernel.kallsyms] [k] wp_page_copy.isra.73
0.16% 0.00% runc:[2:INIT] [kernel.kallsyms] [k] async_page_fault
0.16% 0.01% runc:[2:INIT] [kernel.kallsyms] [k] __do_page_fault
0.16% 0.00% runc:[2:INIT] [kernel.kallsyms] [k] do_async_page_fault
0.16% 0.00% runc:[2:INIT] [kernel.kallsyms] [k] trace_do_page_fault
0.15% 0.00% runc [kernel.kallsyms] [k] ptep_clear_flush
0.15% 0.00% runc [kernel.kallsyms] [k] flush_tlb_page
其他用法
不同的子命令有更详细的用法,请通过perf COMMAND --help
或者perf help COMMAND
查看。
注意事项
- 使用
perf
时,某些操作可能需要 root 权限,特别是全局记录和跟踪系统调用。 - 在高负载系统中,
perf
可能会对性能产生一定影响,建议在性能测试或故障排查时使用。