Linux监控性能调优分析-perf(上)

news/2024/11/15 15:49:48/文章来源:https://www.cnblogs.com/testing-/p/18381560

1 简介

Linux perf一个轻量级命令行工具,用于剖析和监控Linux系统的CPU性能。该工具虽然简单,却能提供有助于分析CPU的丰富信息。该命令包含许多用于收集、跟踪和分析CPU事件数据的子命令。

image

1.1 安装perf

perf程序并没有预装在Linux系统中

# Ubuntu/Debian
$ sudo apt install linux-tools-$(uname -r) linux-tools-generic# RHEL/CentOS
$ sudo yum install perf# Fedora
$ sudo dnf install perf# 验证
$ perf -v
perf version 5.15.149

1.2 允许普通用户使用perf

perf命令默认需要sudo权限。要允许普通用户使用perf,请执行以下操作:

$ sudo su -
# echo 0 > /proc/sys/kernel/perf_event_paranoid
# nano /etc/sysctl.conf # 添加如下内容
kernel.perf_event_paranoid = 0

Linux perf 命令语法

1.3 perf命令的语法如下

perf <options> subcommand <options/arguments>

perf 工具的工作原理与git类似。它是各种子命令和不同活动的接口。运行不带任何选项或参数的命令会显示可用的子命令列表。

  • perf stat
    该命令提供常见性能事件的总体统计数据,包括执行的指令和消耗的时钟周期。除默认测量事件外,还可通过选项选择其他事件。

  • perf record
    该命令将性能数据记录到 perf.data 文件中,随后可使用 perf report 命令对其进行分析。

  • perf report

该命令从 perf record 创建的 perf.data 文件中读取并显示性能数据。

  • perf list
    该命令列出特定机器上的可用事件。这些事件将根据系统的性能监控硬件和软件配置而有所不同。

  • perf top
    该命令执行与 top 工具类似的功能。它会实时生成并显示性能计数器配置文件。

  • perf trace
    该命令执行与 strace 工具类似的功能。它监控指定线程或进程使用的系统调用以及该应用程序接收的所有信号。

  • perf help
    该命令显示 perf 命令的完整列表。

要显示各个子命令的选项,请运行

perf <subcommand> -h

2 使用perf top实时分析CPU使用

2.1 perf top 的用途

perf top 命令用于实时系统剖析,功能与 top 工具类似。不过,top 工具通常显示某个进程或线程占用了多少 CPU 时间,而 perf top 则显示每个特定函数占用了多少 CPU 时间。在默认状态下,perf top 会告诉你用户空间和内核空间中所有 CPU 正在使用的函数。使用 perf top 需要 root 访问权限。

2.2 使用 perf top 分析 CPU 使用

# perf top
Samples: 8K of event 'cycles', 2000 Hz, Event count (approx.): 4579432780 lost: 0/0 drop: 0/0
Overhead  Shared Object       Symbol2.20%  [kernel]            [k] do_syscall_642.17%  [kernel]            [k] module_get_kallsym1.49%  [kernel]            [k] copy_user_enhanced_fast_string1.37%  libpthread-2.29.so  [.] pthread_mutex_lock 1.31% [unknown] [.] 0000000000000000 1.07% [kernel] [k] psi_task_change 1.04% [kernel] [k] switch_mm_irqs_off 0.94% [kernel] [k] fget0.74%  [kernel]            [k] entry_SYSCALL_640.69%  [kernel]            [k] syscall_return_via_sysret0.69%  libxul.so           [.] 0x000000000113f9b00.67%  [kernel]            [k] kallsyms_expand_symbol.constprop.00.65%  firefox             [.] moz_xmalloc0.65%  libpthread-2.29.so  [.] __pthread_mutex_unlock_usercnt0.60%  firefox             [.] free0.60%  libxul.so           [.] 0x000000000241d1cd0.60%  [kernel]            [k] do_sys_poll0.58%  [kernel]            [k] menu_select0.56%  [kernel]            [k] _raw_spin_lock_irqsave0.55%  perf                [.] 0x00000000002ae0f3

2.3 perf top 输出的解释

  • 开销(Overhead)"列

显示特定函数占用 CPU 的百分比。

  • 共享对象(Shared Object)列

显示使用该函数的程序或库的名称。

  • 符号(Symbol)列

显示函数名称或符号。在内核空间执行的函数用 [k] 标识,在用户空间执行的函数用 [.]标识。

2.4 为什么 perf 将某些函数名显示为原始函数地址

对于内核函数,perf 使用 /proc/kallsyms 文件中的信息将样本映射到相应的函数名或符号。但对于在用户空间执行的函数,由于二进制文件已被剥离,因此可能会显示原始函数地址。

在这种情况下,必须安装可执行文件的 debuginfo 包,或者,如果可执行文件是本地开发的应用程序,则必须在编译应用程序时打开调试信息(GCC 中的 -g 选项),以显示函数名或符号。

注意: 安装与可执行文件相关的调试信息后,无需重新运行 perf record 命令。只需重新运行 perf report 命令即可。

2.5 启用调试和源代码库

Linux 的标准安装不会启用调试和源代码库。这些资源库包含调试系统组件和衡量其性能所需的信息。

# subscription-manager repos --enable rhel-8-for-$(uname -i)-baseos-debug-rpms
# subscription-manager repos --enable rhel-8-for-$(uname -i)-baseos-source-rpms
# subscription-manager repos --enable rhel-8-for-$(uname -i)-appstream-debug-rpms
# subscription-manager repos --enable rhel-8-for-$(uname -i)-appstream-source-rpms

2.6 使用 GDB 获取应用程序或库的调试信息包

调试代码需要调试信息。对于通过软件包安装的代码,GNU 调试器(GDB)会自动识别缺失的调试信息,解析软件包名称,并提供如何获取软件包的具体建议。

启动连接到要调试的应用程序或库的 GDB。GDB 会自动识别缺失的调试信息,并建议运行一条命令。

$ gdb -q /bin/ls
Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.30-6.el8.x86_64
(gdb)
# dnf debuginfo-install coreutils-8.30-6.el8.x86_64

3 使用 perf stat 统计进程执行过程中的事件

3.1 perf stat 的用途

perf stat 命令执行指定的命令,对命令执行期间发生的硬件和软件事件进行持续计数,并生成这些计数的统计数据。如果不指定任何事件,perf stat 会统计一组常见的硬件和软件事件。

3.2 用 perf stat 统计事件

$ perf stat ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  VideosPerformance counter stats for 'ls':1.28 msec task-clock:u               #    0.165 CPUs utilized0      context-switches:u         #    0.000 M/sec0      cpu-migrations:u           #    0.000 K/sec104      page-faults:u              #    0.081 M/sec1,054,302      cycles:u                   #    0.823 GHz1,136,989      instructions:u             #    1.08  insn per cycle228,531      branches:u                 #  178.447 M/sec11,331      branch-misses:u            #    4.96% of all branches0.007754312 seconds time elapsed0.000000000 seconds user0.007717000 seconds sys

如上例所示,当 perf stat 在没有 root 访问权限的情况下运行时,事件名称后跟有 :u,表明这些事件仅在用户空间中计数。

要同时统计用户空间和内核空间的事件,运行 perf stat 时必须有 root 访问权限:

# perf stat ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  VideosPerformance counter stats for 'ls':3.09 msec task-clock                #    0.119 CPUs utilized18      context-switches          #    0.006 M/sec3      cpu-migrations            #    0.969 K/sec108      page-faults               #    0.035 M/sec6,576,004      cycles                    #    2.125 GHz5,694,223      instructions              #    0.87  insn per cycle1,092,372      branches                  #  352.960 M/sec31,515      branch-misses             #    2.89% of all branches0.026020043 seconds time elapsed0.000000000 seconds user0.014061000 seconds sys

默认情况下,perf stat 以每线程模式运行。要改用 CPU 范围的事件计数,请在 perf stat 中加入 -a 选项。要计算 CPU 范围内的事件,需要 root 访问权限:

# perf stat -a ls

3.3 perf stat 输出的解释

perf stat 执行指定命令,在命令执行过程中统计事件发生次数,并在三列中显示统计结果:

  • 特定事件的发生次数
  • 被统计事件的名称
  • 如果有相关指标,最右边一列的哈希符号 (#) 后面会显示比率或百分比。

例如,在默认模式下运行时,perf stat 会同时计算周期和指令,因此会在最右边一列计算并显示每个周期的指令数。由于默认情况下这两种事件都被计算在内,因此您可以看到类似的分支错误占所有分支百分比的行为。

3.4 将 perf stat 附加到运行中的进程

您可以将 perf stat 附加到正在运行的进程。这将指示 perf stat 在执行命令期间只计算指定进程中发生的事件。

前提条件

已安装 perf 用户空间工具,如安装 perf 中所述。
操作步骤

将 perf stat 附加到正在运行的进程:

$ perf stat -p ID1,ID2 sleep seconds
上例通过使用 sleep 命令,以秒为单位统计 ID 为 ID1 和 ID2 的进程中的事件。

$ sudo perf stat -p 1913119,4240 sleep 3Performance counter stats for process id '1913119,4240':26.17 msec task-clock                #    0.009 CPUs utilized13      context-switches          #    0.497 K/sec1      cpu-migrations            #    0.038 K/sec1      page-faults               #    0.038 K/sec68,245,892      cycles                    #    2.607 GHz94,333,646      instructions              #    1.38  insn per cycle<not supported>      branches189,274      branch-misses3.001225574 seconds time elapsed

4 使用 perf 记录和分析性能曲线

4.1 perf record的目的

perf record 命令对性能数据进行采样,并将其存储在 perf.data 文件中,可以使用其他 perf 命令读取和可视化该文件。perf.data 在当前目录下生成,可以在以后访问。

如果您没有为 perf record 指定要记录的命令,它会一直记录,直到您按下 Ctrl+C 手动停止进程。你可以通过 -p 选项和一个或多个进程 ID,将 perf record 附加到特定进程。你可以在没有 root 访问权限的情况下运行 perf record,但这样做只能在用户空间采样性能数据。在默认模式下,perf record 使用 CPU 周期作为采样事件,并以启用继承模式的每线程模式运行。

4.2 在没有root访问权限的情况下记录性能配置文件

$ perf record command

将 command 替换为要采样数据的命令。如果不指定命令,perf record 将采样数据,直到您按下 Ctrl+C 手动停止。

4.3 使用 root 记录性能配置文件

perf record command

4.4 以per-CPU模式记录性能配置文件

在 per-CPU 模式下,您可以使用 perf record 同时采样和记录受监控 CPU 上所有线程在用户空间和内核空间的性能数据。默认情况下,per-CPU模式监控所有在线 CPU。

# perf record -a command# 所有CPU
$ perf record -C 127,1 # CPU1和127

4.5 使用 perf record 捕捉调用图数据

您可以配置 perf record 工具,使其记录哪个函数正在调用性能配置文件中的其他函数。这有助于在多个进程调用同一函数时识别瓶颈。

$ perf record --call-graph method command

method为展开堆栈的方法,有如下几种:

  • fp( frame pointe)

使用帧指针方法。根据编译器优化情况,例如使用 GCC 选项 --fomit-frame-pointer 生成的二进制文件,可能无法解开堆栈。

  • dwarf
    使用 DWARF 调用帧信息来展开堆栈。

  • lbr last branch record)

4.6 使用 perf 报告分析 perf.data

如果 perf.data 文件是以 root 访问权限创建的,则也需要以 root 访问权限运行 perf report。

# perf report
Samples: 2K of event 'cycles', Event count (approx.): 235462960
Overhead  Command          Shared Object                     Symbol2.36%  kswapd0          [kernel.kallsyms]                 [k] page_vma_mapped_walk2.13%  sssd_kcm         libc-2.28.so                      [.] memset_avx2_erms 2.13% perf [kernel.kallsyms] [k] smp_call_function_single 1.53% gnome-shell libc-2.28.so [.] strcmp_avx21.17%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_hash_table_lookup0.93%  Xorg             libc-2.28.so                      [.] memmove_avx_unaligned_erms 0.89% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_object_unref 0.87% kswapd0 [kernel.kallsyms] [k] page_referenced_one 0.86% gnome-shell libc-2.28.so [.] memmove_avx_unaligned_erms0.83%  Xorg             [kernel.kallsyms]                 [k] alloc_vmap_area0.63%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_slice_alloc0.53%  gnome-shell      libgirepository-1.0.so.1.0.0      [.] g_base_info_unref0.53%  gnome-shell      ld-2.28.so                        [.] _dl_find_dso_for_object0.49%  kswapd0          [kernel.kallsyms]                 [k] vma_interval_tree_iter_next0.48%  gnome-shell      libpthread-2.28.so                [.] pthread_getspecific 0.47% gnome-shell libgirepository-1.0.so.1.0.0 [.] 0x0000000000013b1d 0.45% gnome-shell libglib-2.0.so.0.5600.4 [.] g_slice_free1 0.45% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_type_check_instance_is_fundamentally_a 0.44% gnome-shell libc-2.28.so [.] malloc 0.41% swapper [kernel.kallsyms] [k] apic_timer_interrupt 0.40% gnome-shell ld-2.28.so [.] _dl_lookup_symbol_x 0.39% kswapd0 [kernel.kallsyms] [k] raw_callee_save___pv_queued_spin_unlock
Additional resources

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
  • 如需技术支持联系钉ding或微信pythontesting , 邮箱: xurongzhong#126.com

4.7 解释 perf 报告输出

  • 开销(Overhead)"列

表示在该特定功能中采集的样本占总体样本的百分比。

  • 命令(Command)列

告诉你样本是从哪个进程中采集的。

  • 共享对象(Shared Object)列

显示样本来自 ELF 映像的名称(样本来自内核时使用 [kernel.kallsyms] 名称)。

  • 符号(Symbol)列

显示函数名称或符号。

在默认模式下,函数按降序排序,开销最大的函数显示在最前面。

4.8 生成可在不同设备上读取的 perf.data 文件

您可以使用 perf 工具将性能数据记录到 perf.data 文件中,以便在不同设备上进行分析。

# perf record -a --call-graph fp sleep seconds

此示例将生成整个系统的 perf.data 数据,时间为使用 sleep 命令后的几秒钟。它还将使用帧指针方法捕获调用图数据。

生成一个包含所记录数据的调试符号的归档文件:

# perf archive
Now please run:$ tar xvf perf.data.tar.bz2 -C ~/.debugwherever you need to run 'perf report' on.
# ls perf.data*
perf.data  perf.data.old  perf.data.tar.bz2

4.9 分析在不同设备上创建的 perf.data 文件

# mkdir -p ~/.debug
# tar xf perf.data.tar.bz2 -C ~/.debug
# perf report

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/788953.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Ubuntu部署企业级kubernetes集群---k8s集群容部署

1.下载用于Kubernetes软件包仓库的公共签名秘钥#如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它。 sudo mkdir -p -m 755 /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrin…

什么是算法?一切皆算法

如果有人问我什么算法?我就一句话:算法就是对一类问题的最优求解路径。如果有人问我什么算法?我就一句话:算法就是对一类问题的最优求解路径。 1、计算机领域的算法概念 算法一直都是计算机领域非常重要的概念,具备极高的地位,各个公司对算法的考察也非常热衷。 我们只有…

Adobe After Effects 2024 v24.6 (macOS, Windows) - 后期特效

Adobe After Effects 2024 v24.6 (macOS, Windows) - 后期特效Adobe After Effects 2024 v24.6 (macOS, Windows) - 后期特效 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom C…

在SimpleRAG中使用SiliconCloud快速测试Function Calling

Funcion Calling介绍 函数调用允许您将模型如gpt-4o与外部工具和系统连接起来。这对于许多事情都很有用,比如为AI助手赋能,或者在你的应用程序与模型之间建立深度集成。 如果您了解或者使用过Semantic Kernel可能会发现除了OpenAI支持Function Calling的模型之外,自动函数调…

Semantic Kernel/C#:一种通用的Function Calling方法,文末附经测试可用的大模型

Funcion Calling介绍 函数调用允许您将模型如gpt-4o与外部工具和系统连接起来。这对于许多事情都很有用,比如为AI助手赋能,或者在你的应用程序与模型之间建立深度集成。 如果您了解或者使用过Semantic Kernel可能会发现除了OpenAI支持Function Calling的模型之外,自动函数调…

折腾 Quickwit,Rust 编写的分布式搜索引擎 - 可观测性之日志管理

Quickwit 从底层构建,旨在 高效地索引非结构化数据,并在云存储上轻松搜索这些数据。 此外,Quickwit 开箱即支持 OpenTelemetry gRPC 和 HTTP(仅 protobuf)协议,并提供了一个 REST API,可以接收任何 JSON 格式的日志。 这让 Quickwit 成为了日志的理想选择!.https://qui…

读软件开发安全之道:概念、设计与实施12不受信任的输入

读软件开发安全之道:概念、设计与实施12不受信任的输入1. 不受信任的输入 1.1. 不受信任的输入可能是编写安全代码的开发人员最关心的问题1.1.1. 最好将其理解为输入系统中的所有不受信任的输入1.1.2. 来自受信任的代码的输入可以提供格式正确的数据1.2. 不受信任的输入是指那…

第12篇 window上验证mysql是否安装成功

1.命令提示符cmd窗口验证 1.1 键盘win+R打开命令提示符,输入cmd。 1.2 在电脑中找到安装好的MySQL的bin文件目录 。这是我的安装目录C:\Program Files\MySQL\MySQL Server 5.7\bin。1.3 在命令提示符中输入cd C:\Program Files\MySQL\MySQL Server 5.7\bin,再输入mysql -h loc…

南沙csp-j/s陈老师解题:1050:骑车与走路

​【题目描述】在清华校园里,没有自行车,上课办事会很不方便。但实际上。并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间。假设找到自行车,开锁并骑上自行车的时间为27秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒行走3.0米…

第11篇 MySql8.0 安装配置教程细讲

话不多说直接开干在安装之前, 先确定一下, 电脑上之前有没有安装MySQL ?或者看看有没有这个路径如果有, 请搜索网上的教程 1,停止服务 2,删除注册表 3,删除安装目录和data目录(如果有data目录的话) 弄完最好再重启系统 如果有删除残留可能导致后面安装出现问题 再开始阅读本教…

记录一次pip安装不了包(换源也不得行)

记录一次pip安装不了包(换源也不得行) 1.使用阿里云。安装不成功 (.venv) PS E:\python项目\路飞学院> pip install scrapy==2.5.1 -i http://mirrors.aliyun.com/pypi/simple/ Looking in indexes: http://mirrors.aliyun.com/pypi/simple/ WARNING: The repository lo…

net core中byte数组如何高效转换为16进制字符串

.NET Core 中把 byte[] 转换为 16 进制字符串的五种方法,简洁,灵活,高性能,哪个适合你?在 .NET Core 中,如何把 byte[] 转换为 16 进制字符串?你能想到哪些方法?什么方式性能最好?今天和大家分享几种转换方式。 往往在处理字符串性能问题时,首先应该想到的是怎么想办…