`perf`(Performance analysis tools for Linux)是Linux官方的性能分析器,它存在于內核源碼目錄的tools/perf中,原名為Linux性能計數器(Performance Counters for Linux,PCL),現名為Linux性能事件(Linux Performance Events,LPE)
作為Linux內核自帶的系統性能優化工具,`perf`憑借其強大的功能和與內核的緊密結合,成為了開發者們不可或缺的利器
一、perf的安裝與基礎使用 在大多數Linux發行版中,`perf`是內核的一部分,但需要通過軟件包管理器進行安裝
安裝命令因發行版的不同而有所差異: Debian/Ubuntu: bash sudo apt update sudo apt install linux-tools-common linux-tools-$(uname -r) Fedora/RHEL/CentOS: bash sudo dnf install perf Arch Linux: bash sudo pacman -S perf 安裝完成后,可以通過運行`perf --version`來確認`perf`是否安裝成功
`perf`提供了許多子命令,每個子命令都專注于特定的性能分析任務
以下是一些常見的用法: 1.分析CPU使用情況(perf stat): `perf stat`用于統計一個命令的執行過程中,硬件和軟件事件發生的次數
例如,可以用它來查看程序執行期間的CPU周期、指令、緩存訪問等硬件計數
bash perf stat ls 輸出將包括程序執行期間的事件統計信息,如CPU周期、指令數、緩存未命中次數和分支未命中次數等
2.查看程序的熱點函數(perf record和`perf report`): `perf record`用于記錄程序的性能數據,特別是CPU性能數據(如函數的執行頻率)
`perf report`則用于分析這些數據,查看程序的熱點函數
bash perf record ./my_program perf report 這將記錄`my_program`的執行數據,并生成一個`perf.data`文件
然后,`perfreport`會打開一個文本用戶界面(TUI),顯示執行數據的分析報告,包括各個函數的執行頻率(如CPU周期占比),幫助識別程序的熱點函數
3.分析系統上的所有進程(perf top): `perf top`類似于`top`,但它分析的是系統上所有進程的實時性能數據,顯示當前占用CPU最多的函數或事件
這有助于了解哪些程序或函數正在消耗最多的系統資源
4.跟蹤系統調用(perf trace): `perf trace`是一個類似于`strace`的工具,它可以跟蹤進程的系統調用并統計其頻率和開銷
例如,跟蹤`ls`命令的系統調用: bash perf trace ls 輸出將顯示`ls`過程中發生的所有系統調用及其耗時
5.分析內核事件(perf sched): `perf sched`可以用來分析內核中的調度事件,了解進程的調度行為,分析系統中是否存在調度延遲等問題
二、perf的高級用法與性能調優 除了基本用法外,`perf`還支持許多高級功能,這些功能在性能調優中尤為重要
1.采樣指定硬件事件: `perf`可以專門采樣某些硬件事件(例如緩存未命中、分支預測失敗等),從而針對性地分析程序的性能問題
例如,記錄程序的緩存未命中情況: bash perf record -e cache-misses ./my_program 這將記錄程序執行期間的緩存未命中次數,有助于分析緩存性能問題
2.對指定PID進行性能分析: 如果想對正在運行的某個進程進行性能分析,可以使用`-p`選項指定進程ID
這對分析后臺運行的進程非常有用
bash
perf record -p 例如:
bash
perf sched record
perf sched latency
通過分析調度延遲,可以找出導致系統調度不均衡的原因
4.程序性能瓶頸分析:
在發現一個程序的執行時間比預期長時,可以使用`perfrecord`和`perf report`來分析程序的性能瓶頸 通過分析函數的CPU使用情況,找出最耗時的部分,進而進行優化
5.CPU資源爭用分析:
當系統負載較高時,可以使用`perftop`查看哪些進程或者函數占用了最多的CPU資源 這有助于定位系統性能瓶頸,分析高CPU占用的原因
三、perf的優勢與局限性
`perf`作為Linux內核自帶的性能分析工具,具有顯著的優勢:
- 性能消耗小:perf在采樣和分析過程中,對系統性能的影響較小,能夠確保分析的準確性
- 生成文件小:perf生成的性能數據文件相對較小,便于存儲和傳輸
- report速度快:perf的分析報告生成速度快,能夠迅速提供性能問題的關鍵信息
- 與內核緊密結合:perf能夠最先應用到加入內核的新特性,確保與內核的兼容性
然而,`perf`也存在一些局限性:
- 不遵守X86 Calling Convention的函數無法獲取堆棧信息:對于某些特定的函數,perf可能無法獲取完整的堆棧信息
- 內聯函數無法獲取堆棧信息:對于內聯函數,`perf`同樣可能無法獲取堆棧信息,這會影響分析的準確性
- 需要處理器支持:perf的某些功能需要處理器的支持,如果處理器不支持,則無法使用這些功能
此外,在使用`perf`時,還需要注意一些常見問題 例如,非root用戶運行`perf`時,可能會出現內存映射頁面大小超過系統限制的問題 此時,可以通過調整`/proc/sys/kernel/perf_event_mlock_kb`的值來解決
四、總結
`perf`是Linux內核中強大的性能分析工具,能夠對CPU事件、系統調用、線程調度、硬件計數器等多種系統層面進行全面的性能分析 通過掌握`perf`的基本用法和高