perf工具使用指导

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 提供了多种子命令,以下是一些常用的命令:

  1. 查看 CPU 性能计数器:
bash 复制代码
perf stat <command>

该命令会运行指定的命令并显示其 CPU 性能统计信息。

  1. 记录性能数据:
bash 复制代码
perf record -a

该命令会在系统上收集性能事件,-a 选项表示全局记录(包括所有 CPU)。该命令会在当前路径下生成perf.data

  1. 分析性能数据:
bash 复制代码
perf report

该命令会显示 perf record 收集到的数据的分析报告。读取当前路径下的perf.data文件。

  1. 跟踪特定进程:
bash 复制代码
perf trace -p <pid>

该命令会实时跟踪指定进程的系统调用。

实际应用场景

  1. 识别性能瓶颈:

使用 perf stat 监控程序的性能,以识别潜在的瓶颈,如 CPU 使用率、缓存命中率等。

  1. 函数级别性能分析:

使用 perf recordperf report,分析函数执行的耗时,帮助定位慢函数。

  1. 系统调用跟踪:

使用 perf trace 跟踪特定进程的系统调用,以分析 I/O 性能和系统调用的开销。

示例

  1. 统计命令执行的性能:
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
  1. 记录整个系统的性能数据:
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) ]
  1. 分析记录的数据:
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 可能会对性能产生一定影响,建议在性能测试或故障排查时使用。
相关推荐
AlfredZhao2 小时前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐1 天前
Linux内存扩容指南
linux
zylyehuo2 天前
Linux 彻底且安全地删除文件
linux
用户805533698032 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297912 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Web3探索者4 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo4 天前
Linux系统中网线与USB网络共享冲突
linux
Sokach10155 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao6 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3107 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql