文章目錄
- 基本介紹
- `perf`命令使用
- reference
歡迎訪問個人網絡日志🌹🌹知行空間🌹🌹
基本介紹
Perf(Performance Counters for Linux,性能計數器子系統)
是一個Linux
性能分析工具,用于分析系統和應用程序的運行時性能。這個工具位于 Linux
內核源代碼樹中,具體位置在 tools/perf
目錄下。雖然它是一個用戶空間的應用程序,但卻是唯一一個被包含在 Linux
內核源碼中的復雜用戶軟件。
Perf
可以幫助開發人員和系統管理員進行函數級和指令級的熱點查找,可以用來分析程序中熱點函數的CPU
占用率,了解CPU
性能計數器、內核跟蹤點和硬件事件等信息,從而找到性能瓶頸,優化軟件性能并診斷問題。
通過 perf
命令,我們可以獲得系統在運行過程中的各種性能數據,例如 CPU
利用率、內存使用情況、磁盤 I/O
等。perf
可以用于多個方面的性能分析,以下是一些常用的用途:
CPU
性能分析,通過perf
命令,可以監測CPU
的使用率、上下文切換次數、緩存命中率等指標,可以幫助開發者找出CPU
性能瓶頸,優化程序的運行效率。- 內存性能分析,
perf
命令可以監測內存的使用情況,例如內存泄漏、內存碎片等問題,可以幫助開發者優化內存的管理,提高系統的穩定性。 - 函數級別采樣,
perf
可以對程序進行函數級別的采樣,從而了解程序的性能瓶頸在哪里。其基本原理是每隔一個固定時間,CPU
會產生一個中斷,記錄當前是哪個進程、哪個函數,然后給對應的進程和函數加一個統計值,從而知道CPU
在某個進程或某個函數上花費了多少時間。
如果系統沒有安裝Perf
,安裝方式為:
sudo apt install linux-tools-common linux-tools-generic
查看是否安裝成功:
perf --version
# perf version 5.15.148
權限設置,默認運行perf
命令需要sudo
權限,可以通過修改/etc/sysctt.conf
文件進行設置
sudo vi /etc/sysctl.conf
# add line
kernel.perf_event_paranoid = 0
perf
命令使用
命令格式為:
perf <options> subcommand <options/arguments>
perf
支持很多subcommand
選項,常用的子命令有:
annotate
讀取perf.data
,展示帶注釋代碼,實際使用發現展示的匯編代碼
sudo perf annotate -f# Percent│ xor %r15d,%r15d
# │ lea 0x9(%rsp),%rbp
# │ testb $0x3,0x90(%rsp)
# │ ↓ je 96
# │ swapgs
# │ nop
# │ xchg %ax,%ax
# │ mov %cr3,%rax
# │ bts $0x3f,%rax
# │ and $0xffffffffffffe7ff,%rax
# │ mov %rax,%cr3
# │ xchg %ax,%ax
# │ mov $0x48,%ecx
list
,展示perf
命令可以用來評估程序性能的事件
sudo perf list -h# Usage: perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|metric|metricgroup|event_glob]
通過上面的命令可以查看事件類型,hw
是hardware
硬件相關事件,PMU
是Performance Monitoring Unit
相關事件等
record
,記錄程序運行時的數據
sudo perf record -e cpu-clock -aR sleep 10# [ perf record: Woken up 1 times to write data ]
# [ perf record: Captured and wrote 0.002 MB perf.data (~150 samples) ]
report
,展示perf
命令記錄的數據
sudo perf report -i perf.data
stat
查看具體某個事件相關的統計結果
sudo perf stat -e cpu-clock -aR sleep 10# Performance counter stats for 'sleep 10':# 1.13 msec cpu-clock # 0.000 CPUs utilized # 10.002228914 seconds time elapsed# 0.001793000 seconds user
# 0.000000000 seconds sys
stat
和record
子命令的主要區別是record
會將結果保存到perf.data
文件中,而stat
是直接展示結果。
top
是直接展示整個系統的CPU
內存等使用情況script
讀取perf.data
數據,并展示跡輸出trace out
子命令 | 作用 |
---|---|
annotate | 匯編代碼及注釋 |
list | 查看所有事件 |
stat | 查看某事件相關的性能數據 |
record | 錄制某事件相關的性能數據,并保存perf.data 文件 |
report | 加載perf.data 文件 |
top | 系統相關的性能數據 |
script | perf.data 相關的trace out |
使用perf
命令追蹤一個正在運行的進程:
sudo perf stat --pid <pid>
reference
1.https://phoenixnap.com/kb/linux-perf#:~:text=The%20Linux%20perf%20tool%20is,and%20analyzing%20CPU%20event%20data.
2.https://cloud.tencent.com/developer/article/2228048