Linux監控&性能調優分析-perf(上)

来源:https://www.cnblogs.com/testing-/p/18381560
-Advertisement-
Play Games

在電腦電源管理中,S1, S2, S3, S4 代表不同的電源狀態或睡眠狀態。 瞭解這些狀態,對電腦設備理解功耗及工作狀態有很大幫助。最近公司開會,系統同事有講S3狀態功耗很低,我猜和電腦的睡眠、息屏有關。。。emmm,不懂就要學 查找資料,以下是這些狀態的詳細說明: S1 狀態(低電量等待狀態 ...


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       Symbol
   2.20%  [kernel]            [k] do_syscall_64
   2.17%  [kernel]            [k] module_get_kallsym
   1.49%  [kernel]            [k] copy_user_enhanced_fast_string
   1.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] fget
   0.74%  [kernel]            [k] entry_SYSCALL_64
   0.69%  [kernel]            [k] syscall_return_via_sysret
   0.69%  libxul.so           [.] 0x000000000113f9b0
   0.67%  [kernel]            [k] kallsyms_expand_symbol.constprop.0
   0.65%  firefox             [.] moz_xmalloc
   0.65%  libpthread-2.29.so  [.] __pthread_mutex_unlock_usercnt
   0.60%  firefox             [.] free
   0.60%  libxul.so           [.] 0x000000000241d1cd
   0.60%  [kernel]            [k] do_sys_poll
   0.58%  [kernel]            [k] menu_select
   0.56%  [kernel]            [k] _raw_spin_lock_irqsave
   0.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  Videos

 Performance counter stats for 'ls':

              1.28 msec task-clock:u               #    0.165 CPUs utilized
                 0      context-switches:u         #    0.000 M/sec
                 0      cpu-migrations:u           #    0.000 K/sec
               104      page-faults:u              #    0.081 M/sec
         1,054,302      cycles:u                   #    0.823 GHz
         1,136,989      instructions:u             #    1.08  insn per cycle
           228,531      branches:u                 #  178.447 M/sec
            11,331      branch-misses:u            #    4.96% of all branches

       0.007754312 seconds time elapsed

       0.000000000 seconds user
       0.007717000 seconds sys

如上例所示,當 perf stat 在沒有 root 訪問許可權的情況下運行時,事件名稱後跟有 :u,表明這些事件僅在用戶空間中計數。

要同時統計用戶空間和內核空間的事件,運行 perf stat 時必須有 root 訪問許可權:

# perf stat ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

 Performance counter stats for 'ls':

              3.09 msec task-clock                #    0.119 CPUs utilized
                18      context-switches          #    0.006 M/sec
                 3      cpu-migrations            #    0.969 K/sec
               108      page-faults               #    0.035 M/sec
         6,576,004      cycles                    #    2.125 GHz
         5,694,223      instructions              #    0.87  insn per cycle
         1,092,372      branches                  #  352.960 M/sec
            31,515      branch-misses             #    2.89% of all branches

       0.026020043 seconds time elapsed

       0.000000000 seconds user
       0.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 3

 Performance counter stats for process id '1913119,4240':

             26.17 msec task-clock                #    0.009 CPUs utilized
                13      context-switches          #    0.497 K/sec
                 1      cpu-migrations            #    0.038 K/sec
                 1      page-faults               #    0.038 K/sec
        68,245,892      cycles                    #    2.607 GHz
        94,333,646      instructions              #    1.38  insn per cycle
   <not supported>      branches
           189,274      branch-misses

       3.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                     Symbol
   2.36%  kswapd0          [kernel.kallsyms]                 [k] page_vma_mapped_walk
   2.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_avx2
   1.17%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_hash_table_lookup
   0.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_erms
   0.83%  Xorg             [kernel.kallsyms]                 [k] alloc_vmap_area
   0.63%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_slice_alloc
   0.53%  gnome-shell      libgirepository-1.0.so.1.0.0      [.] g_base_info_unref
   0.53%  gnome-shell      ld-2.28.so                        [.] _dl_find_dso_for_object
   0.49%  kswapd0          [kernel.kallsyms]                 [k] vma_interval_tree_iter_next
   0.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

參考資料

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 ~/.debug

wherever 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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • Scoop 安裝 環境需求 PowerShell 5 + .NET Framework 4.5 + 安裝 指定安裝位置(配置環境變數) 以管理員身份打開PowerShell $env:SCOOP='D:\Applications\Scoop' [Environment]::SetEnvironmen ...
  • 第二十一章 machine.UART類實驗 1)實驗平臺:正點原子DNK210開發板 2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0 3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套實驗源碼+手冊+ ...
  • 概述 Windows 遠程桌面(也稱為 RDP)允許你從一臺電腦遠程連接到另一臺運行 Windows 操作系統的電腦。 開啟遠程桌面 在“設置”中前往“系統>遠程桌面”,將“遠程桌面”設置為“開”。 確保Windows正確存儲微軟賬號的密碼 絕大多數情況下,我們將使用微軟賬號及其密碼來登錄“遠程 ...
  • liwen01 2024.09.01 前言 最近十幾年,通信技術發展迅猛,通信標準更新頻繁,有的設備還在使用 802.11/b/g/n 協議,有的已支持到 WiFi6、WiFi7。 而國內有關無線 WiFi 的書籍或資料卻很少,就算能找著的,大多也是比較老舊。本文試圖使用最新的數據來介紹 WiFi ...
  • 本章將和大家分享Docker中常用的命令。廢話不多說,下麵我們直接進入主題。 1、配置鏡像加速源 拉取鏡像慢,配置載入鏡像地址: 創建一個或修改 /etc/docker/daemon.json 文件(如果不存在則創建): vim /etc/docker/daemon.json 並添加或修改regis ...
  • Mac上HomeBrew安裝及換源教程 Mac的Mac OS系統來源於Unix系統,得益於此Mac系統的使用類似於Linux,因此Linux系統中的包管理概念也適用於Mac,而HomeBrew便是其中的一個優秀的包管理工具,而包管理工具是什麼呢?軟體包管理工具,擁有安裝、卸載、更新、查看、搜索等功能 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...