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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...