在電腦電源管理中,S1, S2, S3, S4 代表不同的電源狀態或睡眠狀態。 瞭解這些狀態,對電腦設備理解功耗及工作狀態有很大幫助。最近公司開會,系統同事有講S3狀態功耗很低,我猜和電腦的睡眠、息屏有關。。。emmm,不懂就要學 查找資料,以下是這些狀態的詳細說明: S1 狀態(低電量等待狀態 ...
1 簡介
Linux perf一個輕量級命令行工具,用於剖析和監控Linux系統的CPU性能。該工具雖然簡單,卻能提供有助於分析CPU的豐富信息。該命令包含許多用於收集、跟蹤和分析CPU事件數據的子命令。
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
參考資料
- 軟體測試精品書籍文檔下載持續更新 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 ~/.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