linux perf工具使用指导

perf 是 Linux 内核自带的性能分析工具,主要用于分析系统性能瓶颈和程序的性能问题。通过合理使用 perf 工具,可以有效地分析和优化系统性能。

安装 perf

在大多数 Linux 发行版中,perf 工具通常随内核源代码包一起提供。可以通过以下命令安装:

Ubuntu/Debian:

sudo apt-get install linux-tools-$(uname -r)

CentOS/RHEL:

sudo yum install perf

基本用法

perf帮助文档:

]# 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 性能计数器:
perf stat <command>

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

  1. 记录性能数据:
perf record -a

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

  1. 分析性能数据:
perf report

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

  1. 跟踪特定进程:
perf trace -p <pid>

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

实际应用场景

  1. 识别性能瓶颈:

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

  1. 函数级别性能分析:

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

  1. 系统调用跟踪:

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

示例

  1. 统计命令执行的性能:
]# 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. 记录整个系统的性能数据:
]# 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. 分析记录的数据:
[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 可能会对性能产生一定影响,建议在性能测试或故障排查时使用。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部