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 可能会对性能产生一定影响,建议在性能测试或故障排查时使用。
相关推荐
QT.qtqtqtqtqt23 分钟前
攻防世界easyphp
linux·运维·服务器
菜鸟康1 小时前
Linux系统编程——系统内核中的信号
linux·运维·服务器
CSND7403 小时前
Ubuntu vi(vim)编辑器配置一键补全main函数
linux·c语言·ubuntu·编辑器·vim
シ風箏6 小时前
Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用
linux·数据库·arm·neo4j
Cachel wood8 小时前
Vue.js前端框架教程8:Vue消息提示ElMessage和ElMessageBox
linux·前端·javascript·vue.js·前端框架·ecmascript
小屁不止是运维10 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
超爱吃士力架11 小时前
Ubuntu操作系统安装docker
linux·前端·后端
黑客K-ing12 小时前
网络安全防范
linux·服务器·web安全
王三三13 小时前
群晖利用acme.sh自动申请证书并且自动重载证书的问题解决
linux·自动化·证书·群晖·acme·acme.sh·lets encrypt
路飞雪吖~13 小时前
【Linux】进程控制
linux·运维·服务器