0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux perf 簡要介紹

科技綠洲 ? 來源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-09 17:06 ? 次閱讀

一、引言 (Introduction)

簡要介紹Linux perf (Brief Introduction to Linux perf)

Linux perf(性能分析工具)是一個功能強大且靈活的性能剩余工具,它可以在Linux系統(tǒng)上檢測和調(diào)試各種性能問題。Linux內(nèi)核集成了perf工具,可用于探測內(nèi)核性能事件、硬件性能計數(shù)器以及用戶級應(yīng)用程序性能事件。

perf工具可以用于剖析(profile)應(yīng)用程序,從而找出瓶頸和優(yōu)化點,以提高系統(tǒng)的性能和穩(wěn)定性。它支持多種統(tǒng)計和視圖模式,能夠為開發(fā)人員和系統(tǒng)管理員提供深入的性能分析。

為什么了解perf對Linux用戶至關(guān)重要 (Why Understanding perf is Crucial for Linux Users)

了解并掌握perf工具對Linux用戶來說至關(guān)重要,原因有以下幾點:

a) 性能優(yōu)化:perf可以幫助開發(fā)者發(fā)現(xiàn)程序中的性能瓶頸,并對其進行優(yōu)化。通過對代碼的性能分析,開發(fā)者能夠更有效地找出影響性能的關(guān)鍵部分,從而改進程序。

b) 系統(tǒng)監(jiān)控:系統(tǒng)管理員可以使用perf實時監(jiān)控Linux系統(tǒng)的資源使用情況,從而及時發(fā)現(xiàn)并處理潛在問題,確保系統(tǒng)穩(wěn)定高效運行。

c) 問題定位:在面對復(fù)雜的性能問題時,perf能夠提供詳細的分析數(shù)據(jù),幫助開發(fā)者和系統(tǒng)管理員精確定位問題根源,提高解決問題的效率。

d) 學(xué)習(xí)與理解:perf不僅僅是一個性能分析工具,還能幫助用戶更深入地了解Linux系統(tǒng)的運行原理。通過使用perf,用戶可以更好地理解Linux內(nèi)核的工作機制,從而在開發(fā)和維護過程中做出更明智的決策。

總之,熟練掌握Linux perf工具可以幫助開發(fā)者和系統(tǒng)管理員提高系統(tǒng)性能、解決問題和優(yōu)化系統(tǒng)資源。從而使得Linux系統(tǒng)運行更加穩(wěn)定、高效,滿足用戶需求。

二、perf工具概覽 (Overview of perf Tool)

perf工具的來源與發(fā)展 (Origin and Development of perf Tool)

perf工具最早源于Linux內(nèi)核開發(fā)者對性能分析需求的不斷增長。2009年,Ingo Molnar率先引入了perf工具,并將其合并進Linux內(nèi)核版本2.6.31。隨著時間的推移,perf工具得到了持續(xù)改進和發(fā)展,成為了Linux內(nèi)核開發(fā)者和系統(tǒng)管理員日常工具的重要組成部分。

perf工具在Linux內(nèi)核社區(qū)的支持下,不斷地擴展了其功能和性能分析領(lǐng)域。與此同時,硬件制造商也開始支持perf工具,為各種處理器和平臺提供特定的性能計數(shù)器。如今,perf工具已經(jīng)成為Linux內(nèi)核中一款功能強大且廣泛應(yīng)用的性能分析工具。

perf工具的核心組件 (Core Components of perf Tool)

perf工具主要包括以下幾個核心組件:

a) perf事件:perf事件是perf工具的基礎(chǔ),代表了一個特定的性能度量。事件可以是內(nèi)核、硬件或用戶級應(yīng)用程序產(chǎn)生的。這些事件可以用于監(jiān)控、統(tǒng)計和剖析各種性能指標。

b) perf計數(shù)器:計數(shù)器是用于記錄perf事件發(fā)生次數(shù)的設(shè)備。內(nèi)核與硬件之間的接口由內(nèi)核提供,以便于硬件計數(shù)器和perf工具之間的通信。

c) perf命令行工具:perf命令行工具是用戶與perf工具進行交互的主要方式。它提供了一系列子命令,如stat、record、report等,用于控制和分析性能數(shù)據(jù)。

d) perf數(shù)據(jù)存儲:perf工具會將收集到的性能數(shù)據(jù)存儲在特定格式的文件中,以便后續(xù)進行分> > 析。用戶可以使用perf report命令讀取這些文件,并以多種方式展示性能數(shù)據(jù)。

e) perf分析器:分析器是perf工具的核心組件之一,負責對收集到的性能數(shù)據(jù)進行深入分析。它能夠生成詳細的報告,揭示系統(tǒng)和應(yīng)用程序中的性能瓶頸和優(yōu)化點。

通過這些核心組件,perf工具為Linux用戶提供了強大而靈活的性能分析功能,幫助用戶優(yōu)化系統(tǒng)性能、解決問題和了解Linux系統(tǒng)運行原理。

三、perf的基本命令與用法 (Basic Commands and Usage of perf)

perf list:查看可用事件 (perf list: Viewing Available Events)

使用 perf list 命令可以查看系統(tǒng)中可用的perf事件列表。這些事件包括硬件事件、軟件事件和內(nèi)核跟蹤點等。通過這些事件,用戶可以選擇要監(jiān)控的性能指標。

$ perf list

以下是 perf list 可用的參數(shù)

  1. -F 或 --fields:指定用于描述事件的輸出字段??梢赃x擇多個字段,使用逗號分隔。例如,-F event,desc 將輸出事件名稱和描述。
  2. -H 或 --show-hierarchy:以層次結(jié)構(gòu)形式展示事件列表。
  3. --help:顯示幫助信息,包括可用參數(shù)和簡要說明。
  4. --filter:將事件列表過濾為與指定字符串匹配的事件。

perf stat:查看性能統(tǒng)計信息 (perf stat: Viewing Performance Statistics)

perf stat 命令用于收集和顯示性能計數(shù)器統(tǒng)計信息。它可以針對整個系統(tǒng)或特定進程收集數(shù)據(jù),并顯示事件的發(fā)生次數(shù)、占比等信息。

$ perf stat [options] [command]

以下是 perf stat 的一些常用參數(shù):

  1. -e 或 --event:指定要收集的事件類型,例如:cache-misses, instructions 等。
  2. -p 或 --pid:指定要監(jiān)視的進程ID。
  3. -t 或 --tid:指定要監(jiān)視的線程ID。
  4. -a 或 --all-cpus:監(jiān)視所有CPU,而不僅僅是當前CPU。
  5. -C 或 --cpu:指定要監(jiān)視的CPU列表。
  6. -c 或 --count:設(shè)置每個事件的采樣周期。
  7. -r 或 --repeat:重復(fù)運行給定的命令并收集統(tǒng)計信息,指定重復(fù)次數(shù)。
  8. -d 或 --detailed:顯示詳細的統(tǒng)計信息。
  9. -D 或 --delay:設(shè)置統(tǒng)計輸出之間的延遲時間(以毫秒為單位)。
  10. -n 或 --null:僅運行命令,不收集統(tǒng)計信息。
  11. -o 或 --output:指定將數(shù)據(jù)寫入的文件。
  12. -A 或 --no-aggr:不進行聚合統(tǒng)計,為每個硬件事件單獨顯示結(jié)果。
  13. --metric-only:僅顯示指定的度量結(jié)果,不顯示原始硬件事件。
  14. --metricgroup:選擇度量組。例如,--metricgroup core。
  15. --metrics:顯示與指定事件相關(guān)的度量。
  16. --per-socket:按每個 CPU 套接字顯示聚合統(tǒng)計。
  17. --per-core:按每個物理 CPU 核心顯示聚合統(tǒng)計。
  18. --per-thread:按每個線程顯示聚合統(tǒng)計。
  19. --no-merge:不合并不同 PMU (Performance Monitoring Unit) 的結(jié)果。

perf record:記錄性能數(shù)據(jù) (perf record: Recording Performance Data)

perf record 命令用于收集指定事件的性能數(shù)據(jù),并將其保存在文件中以便后續(xù)分析。默認情況下,數(shù)據(jù)將保存在名為 perf.data 的文件中。

$ perf record [options] [command]

以下是perf record命令的一些常用參數(shù):

  1. -e 或 --event:指定要記錄的事件類型,例如cache-misses, instructions等。
  2. -p 或 --pid:指定要監(jiān)控的進程ID。
  3. -t 或 --tid:指定要監(jiān)控的線程ID。
  4. -a 或 --all-cpus:監(jiān)控所有CPU,而不僅僅是當前CPU。
  5. -C 或 --cpu:指定要監(jiān)控的CPU列表。
  6. -f 或 --overwrite:以覆蓋模式記錄事件。
  7. -c 或 --count:設(shè)置每個事件的采樣周期。
  8. -r 或 --real-time:設(shè)置實時優(yōu)先級。
  9. -o 或 --output:指定要將數(shù)據(jù)寫入的文件。
  10. -g 或 --call-graph:指定調(diào)用圖記錄方法,例如dwarf或fp(幀指針)。
  11. --switch-events:記錄上下文切換事件。
  12. --no-buffering:禁用數(shù)據(jù)緩沖。
  13. --dry-run:顯示要執(zhí)行的操作,但不實際執(zhí)行。

perf report:生成性能報告 (perf report: Generating Performance Reports)

perf report 命令從 perf.data 文件中讀取性能數(shù)據(jù),并以多種格式展示分析結(jié)果。用戶可以根據(jù)需要自定義報告的輸出格式。

$ perf report [options]

以下是 perf report 的一些常用參數(shù):

  1. -i 或 --input:指定要讀取的輸入文件,默認為 perf.data。
  2. -F 或 --fields:指定要顯示的字段,例如:comm, dso, symbol 等。
  3. --sort:指定排序順序,例如:dso,symbol 或 symbol,dso。
  4. --show-total-period:顯示每個符號的總周期數(shù)。
  5. -T 或 --threads:顯示線程相關(guān)數(shù)據(jù)。
  6. -m 或 --modules:顯示模塊(共享庫)相關(guān)數(shù)據(jù)。
  7. -k 或 --vmlinux:指定內(nèi)核符號表文件(vmlinux)的路徑。
  8. -f 或 --force:強制解析文件,即使它看起來無效或損壞。
  9. -c 或 --comms:指定要顯示的命令(進程)列表。
  10. --dsos:指定要顯示的動態(tài)共享對象(DSO)列表。
  11. -s 或 --symbols:指定要顯示的符號(函數(shù))列表。
  12. --percent-limit:僅顯示超過指定百分比的項。
  13. -P 或 --pretty:指定輸出格式,如raw、normal等。
  14. --stdio:以文本模式顯示報告(而非 TUI 模式)。
  15. --tui:以 TUI 模式顯示報告(默認方式)。
  16. --gtk:以 GTK 模式顯示報告。
  17. -g 或 --call-graph:顯示調(diào)用圖數(shù)據(jù)。
  18. --no-children:僅顯示獨立樣本,不顯示調(diào)用子函數(shù)的樣本。
  19. --no-demangle:禁用 C++ 符號解析。
  20. --demangle:指定 C++ 符號解析方式,如:no, normal, smart 等。
  21. --filter:指定過濾器,如:--filter 'dso(/lib*)'。
  22. --max-stack:指定棧幀的最大數(shù)量。

perf annotate:源碼級別的性能分析 (perf annotate: Source Code-Level Performance Analysis)

perf annotate 命令可以實現(xiàn)源碼級別的性能分析。它展示了各個函數(shù)中指令的性能數(shù)據(jù),幫助用戶發(fā)現(xiàn)程序中的瓶頸。

$ perf annotate [options] [symbol]

以下是 perf annotate 的一些常用參數(shù):

  1. -i 或 --input:指定要讀取的輸入文件,默認為 perf.data。
  2. -s 或 --symbol:指定要注解的符號(函數(shù))名稱。
  3. -d 或 --dsos:指定要注解的動態(tài)共享對象(DSO)名稱。
  4. -P 或 --pretty:指定輸出格式,如raw、normal等。
  5. --stdio:以文本模式顯示注解(而非 TUI 模式)。
  6. --tui:以 TUI 模式顯示注解(默認方式)。
  7. --gtk:以 GTK 模式顯示注解。
  8. --no-source:僅顯示匯編代碼,不顯示源代碼。
  9. --group:將指定事件作為事件組進行注解。
  10. -f 或 --force:強制解析文件,即使它看起來無效或損壞。
  11. --show-total-period:顯示每個符號的總周期數(shù)。
  12. -k 或 --vmlinux:指定內(nèi)核符號表文件(vmlinux)的路徑。
  13. --buildid-dir:指定包含構(gòu)建 ID 數(shù)據(jù)的目錄。
  14. --buildid-cache-dir:指定用于緩存構(gòu)建 ID 數(shù)據(jù)的目錄。
  15. --no-cache:禁用構(gòu)建 ID 緩存。
  16. --percent-type:指定百分比類型,如:local, global等。
  17. --percent-limit:僅顯示超過指定百分比的項。

perf top:實時查看熱點函數(shù) (perf top: Real-Time Viewing of Hot Functions)

perf top 命令實時顯示系統(tǒng)中最耗費CPU資源的函數(shù)。這有助于用戶快速定位導(dǎo)致性能問題的代碼部分。

$ perf top [options]

以下是 perf top 的一些常用參數(shù):

  1. -e 或 --event:指定要收集的事件類型,例如:cache-misses, instructions 等。
  2. -p 或 --pid:指定要監(jiān)視的進程ID。
  3. -t 或 --tid:指定要監(jiān)視的線程ID。
  4. -a 或 --all-cpus:監(jiān)視所有CPU,而不僅僅是當前CPU。
  5. -C 或 --cpu:指定要監(jiān)視的CPU列表。
  6. -d 或 --delay:設(shè)置刷新間隔(以毫秒為單位)。
  7. -c 或 --count:設(shè)置每個事件的采樣周期。
  8. --call-graph:設(shè)置調(diào)用圖記錄方法,例如:dwarf 或 fp(幀指針)。
  9. --real-time:以實時優(yōu)先級運行 perf top。
  10. -S 或 --sort:指定排序順序,例如:comm,dso 或 dso,comm。
  11. -M 或 --show-mmap-events:顯示 mmap 事件。
  12. -K 或 --hide_kernel_symbols:隱藏內(nèi)核符號。
  13. -U 或 --hide_user_symbols:隱藏用戶空間符號。
  14. -z 或 --zero:啟動時將計數(shù)器清零。
  15. --sym-annotate:運行 perf annotate。
  16. --symbols:指定要顯示的符號(函數(shù))列表。
  17. --dsos:指定要顯示的動態(tài)共享對象(DSO)列表。

perf bench:內(nèi)置基準測試 (perf bench: Built-In Benchmark Testing)

perf bench 命令提供了一組內(nèi)置的基準測試,用于評估系統(tǒng)的性能。這些測試涵蓋了內(nèi)存、調(diào)度、文件系統(tǒng)等多個方面。

$ perf bench [options] [subcommand]

以下是 perf bench 的一些常用參數(shù):

  1. --list:列出所有可用的基準測試。
  2. --help:顯示幫助信息,包括可用參數(shù)和簡要說明。
  3. -p 或 --process:使用進程實現(xiàn)多任務(wù)測試,而非線程(適用于某些基準測試,如 sched )。

perf bench 命令下有幾個子命令,可以用于運行不同類型的基準測試:

  1. futex:針對 futex(快速用戶空間互斥鎖)操作的基準測試。
  2. sched:針對調(diào)度器(進程/線程切換)的基準測試。
  3. mem:針對內(nèi)存操作的基準測試。
  4. kallsyms:針對內(nèi)核符號查找的基準測試。
  5. cgroup:針對 cgroup 的基準測試。

perf trace:系統(tǒng)調(diào)用跟蹤與分析 (perf trace: System Call Tracing and Analysis)

perf trace 命令用于跟蹤和分析系統(tǒng)調(diào)用,幫助用戶了解程序在運行時如何與內(nèi)核進行交互。這對于排查性能問題和理解系統(tǒng)行為非常有用。

$ perf trace [options] [command]

以下是 perf trace 的一些常用參數(shù):

  1. -a 或 --all-cpus:在所有CPU上監(jiān)視事件,而不僅僅是在當前CPU上。
  2. -C 或 --cpu:指定要監(jiān)視的CPU列表。
  3. -p 或 --pid:指定要監(jiān)視的進程ID。
  4. -t 或 --tid:指定要監(jiān)視的線程ID。
  5. -e 或 --event:指定要監(jiān)視的事件類型。如:sched, raw_syscalls 等。
  6. -i 或 --input:從指定文件讀取數(shù)據(jù),默認為 perf.data。
  7. -o 或 --output:將數(shù)據(jù)寫入指定文件。
  8. --duration:設(shè)置監(jiān)視事件的最長持續(xù)時間(以秒為單位)。
  9. -g 或 --call-graph:記錄調(diào)用圖信息,例如:dwarf, fp(幀指針)等。
  10. -D 或 --delay:設(shè)置統(tǒng)計輸出之間的延遲時間(以毫秒為單位)。
  11. --syscall-events:僅監(jiān)視系統(tǒng)調(diào)用事件。
  12. --tool_stats:顯示工具統(tǒng)計信息。
  13. --summary:顯示匯總統(tǒng)計信息。
  14. --summary-only:僅顯示匯總統(tǒng)計信息。
  15. -s 或 --show-syscall-stats:顯示系統(tǒng)調(diào)用統(tǒng)計信息。
  16. --sched:顯示調(diào)度事件。
  17. -v 或 --verbose:詳細輸出。
  18. --wide:寬輸出。
  19. --no-sys-names:不顯示系統(tǒng)調(diào)用名稱。
  20. --raw-trace:輸出原始跟蹤數(shù)據(jù),而不是格式化輸出。
  21. --skip-clear:在監(jiān)視之前不清除屏幕。
  22. --stats:顯示統(tǒng)計數(shù)據(jù)。
  23. --runtime:設(shè)置最長運行時間(以秒為單位)。
  24. --timestamp:顯示時間戳。

以上介紹的是perf工具的一些基本命令和用法,通過這些命令,用戶可以針對不同場景進行性能分析.

四、perf實際應(yīng)用與案例 (Practical Applications and Cases of perf)

CPU性能分析 (CPU Performance Analysis)

perf工具可以分析CPU的使用情況,如緩存命中率、分支預(yù)測錯誤率等。以下是一個使用perf stat分析CPU性能的簡單示例:

$ perf stat -e cycles,instructions,cache-references,cache-misses,branches,branch-misses -- ./my_program

此命令將收集指定事件的數(shù)據(jù),并在程序運行結(jié)束后顯示統(tǒng)計信息。

內(nèi)存性能分析 (Memory Performance Analysis)

使用perf工具,用戶可以對內(nèi)存訪問進行深入分析,以確定內(nèi)存性能瓶頸。以下示例展示了如何使用perf mem命令分析內(nèi)存性能:

** perf mem record ./my_program ** perf mem report

這將記錄內(nèi)存訪問事件并生成報告,幫助用戶發(fā)現(xiàn)程序中的內(nèi)存瓶頸。

IO性能分析 (IO Performance Analysis)

perf可以跟蹤與IO相關(guān)的事件,如磁盤讀寫操作。以下示例展示了如何使用perf trace命令分析IO性能:

$ perf trace -e block:block_rq_issue,block:block_rq_complete -- ./my_program

這將跟蹤磁盤請求的發(fā)出和完成事件,并展示相關(guān)信息。

軟件性能調(diào)優(yōu) (Software Performance Tuning)

perf工具可以幫助開發(fā)者發(fā)現(xiàn)代碼中的性能瓶頸,從而進行優(yōu)化。例如,可以使用perf record和perf report命令對程序進行剖析:

** perf record -g ./my_program ** perf report

這將記錄程序的性能數(shù)據(jù),并生成一個包含熱點函數(shù)和調(diào)用圖的報告。

系統(tǒng)瓶頸定位 (System Bottleneck Localization)

perf可以輔助系統(tǒng)管理員找出系統(tǒng)資源瓶頸,例如使用perf top命令實時監(jiān)控耗費CPU資源的函數(shù):

$ perf top

這有助于快速發(fā)現(xiàn)系統(tǒng)中的性能問題,并采取相應(yīng)措施進行優(yōu)化。

硬件性能評估 (Hardware Performance Evaluation)

perf工具還可以用于評估硬件性能,如處理器、內(nèi)存等。使用perf bench命令進行內(nèi)置基準測試,例如測試內(nèi)存帶寬:

$ perf bench mem memcpy

此命令將執(zhí)行內(nèi)存拷貝基準測試,并輸出性能數(shù)據(jù)。

通過這些實際應(yīng)用和案例,perf工具為開發(fā)者、系統(tǒng)管理員和硬件工程師提供了強大的性能分析能力,幫助他們優(yōu)化軟件和硬件,提升整體系統(tǒng)性能。

五、perf生成火焰圖

生成火焰圖步驟

1. 運行perf

在終端中輸入以下命令:

sudo perf record -F 99 -p -g -- sleep 30perf record表示采集系統(tǒng)事件,

  • -F 指定采樣頻率為 99Hz(每秒99次),如果 99次 都返回同一個函數(shù)名, 那就說明 CPU 這一秒鐘都在執(zhí)行同一個函數(shù), 可能存在性能問題.
  • -p 表示要分析的進程ID,-g表示采集調(diào)用棧信息,-- sleep 30表示運行perf采樣30秒。
  • -p 2347 是進程號, 即對哪個進程進行分析
  • -g 表示記錄調(diào)用棧, sleep 30 則是持續(xù) 30 秒.
  • -e :指定要監(jiān)控的硬件事件,如 CPU 循環(huán)計數(shù)器、緩存事件等。沒有使用 -e 指定采集事件, 則默認采集 cycles(即 CPU clock 周期),
  • -a:監(jiān)控所有進程而不僅僅是指定的進程。
  • -t :監(jiān)控指定線程的事件。
  • -o :將記錄的數(shù)據(jù)寫入指定的文件中。
  • –call-graph :指定要記錄的調(diào)用圖類型,如函數(shù)調(diào)用圖、分支跳轉(zhuǎn)圖等。
  • –no-samples:只記錄事件,不記錄采樣數(shù)據(jù)。
  • –no-buildid-cache:不使用緩存的 build ID 信息。
  • –no-unwind:不進行棧回溯操作,加快采樣速度。
  • –no-vmlinux:不使用 vmlinux 文件進行符號解析,只使用內(nèi)核模塊的符號表。
  • –no-dump:不將采樣數(shù)據(jù)轉(zhuǎn)儲到文件中,只輸出分析結(jié)果。
  • –mmap-pages :指定用于存儲采樣數(shù)據(jù)的內(nèi)存頁數(shù)。
  • –max-stack :指定?;厮莸淖畲笊疃取?/li>
  • –time :指定記錄的時間長度。
  • –weight :為指定事件設(shè)置權(quán)重,用于平衡多個事件的采樣率。

生成火焰圖

FlameGraph tool install

$ git clone https://github.com/brendangregg/FlameGraph

Output perf.data/out.perf

perf record -p {pid} -a -g -F 99 -- sleep 10 //生成perf.data
perf script > out.perf //通過perf.data 生成out.perf

拷貝out.perf到ubuntu

# 折疊調(diào)用棧
FlameGraph/stackcollapse-perf.pl out.perf > out.folded
# 生成火焰圖
FlameGraph/flamegraph.pl out.folded > out.svg
# sudo perf script | stackcollapse-perf.pl | flamegraph.pl > perf.svg

其中,stackcollapse-perf.pl和flamegraph.pl是兩個Perl腳本,用于將perf采集到的數(shù)據(jù)轉(zhuǎn)換成火焰圖的格式。perf.svg是生成的火焰圖文件名。

查看火焰圖

打開perf.svg文件,可以看到生成的火焰圖?;鹧鎴D的橫軸表示時間,縱軸表示調(diào)用棧,每個矩形代表一個函數(shù)調(diào)用,矩形的寬度表示該函數(shù)調(diào)用的時間占總時間的比例,顏色越深表示該函數(shù)調(diào)用的嵌套層數(shù)越深。

通過觀察火焰圖,可以找出應(yīng)用程序的性能瓶頸,進而優(yōu)化代碼。

六、perf的高級技巧與實踐 (Advanced Techniques and Practices of perf)

自定義性能事件 (Customizing Performance Events)

perf允許用戶自定義事件,以滿足特定性能分析需求。例如,通過指定原始事件代碼,用戶可以定制硬件性能計數(shù)器事件:

$ perf stat -e rNNN -- ./my_program

其中NNN是原始事件代碼。此外,還可以使用事件組合來關(guān)注多個相關(guān)事件:

shellCopy code

$ perf stat -e '{cycles,instructions},{cache-references,cache-misses}' -- ./my_program

結(jié)合其他性能工具使用perf (Using perf in Combination with Other Performance Tools)

perf工具可以與其他性能分析工具結(jié)合使用,以提供更豐富的性能洞察。例如,使用perf與FlameGraph可以生成交互式火焰圖,以便更直觀地查看性能數(shù)據(jù):

$ perf record -g -- ./my_program $ perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flamegraph.svg

多核性能分析 (Multi-Core Performance Analysis)

在多核處理器系統(tǒng)中,可以使用perf分析各個核心的性能。以下示例展示了如何使用perf stat命令監(jiān)控特定CPU核心上的事件:

$ perf stat -C 0-3 -e cycles,instructions -- ./my_program

這將僅監(jiān)控CPU核心0到3上的事件。

長時間監(jiān)控與分析 (Long-Term Monitoring and Analysis)

perf可以用于長時間的系統(tǒng)性能監(jiān)控。例如,可以使用perf record持續(xù)記錄性能數(shù)據(jù),并在需要時使用perf report進行分析:

$ perf record -a -F 100 -g -- sleep 86400

這將以100Hz的采樣率記錄全系統(tǒng)性能數(shù)據(jù),持續(xù)86400秒(一天)。

分析虛擬化和容器環(huán)境中的性能 (Analyzing Performance in Virtualization and Container Environments)

在虛擬化和容器環(huán)境中,perf仍然可以提供準確的性能分析。例如,在Docker容器中使用perf工具:

$ docker run --privileged -v /usr/bin/perf:/usr/bin/perf -it my_image /bin/bash

這將在容器內(nèi)運行perf,允許訪問主機的性能計數(shù)器。

通過這些高級技巧與實踐,perf工具的性能分析能力得到了進一步拓展,使用戶能夠更深入地挖掘系統(tǒng)性能,從而優(yōu)化和調(diào)試復(fù)雜的應(yīng)用程序和系統(tǒng)環(huán)境。

七、常見問題與解決方案 (Common Problems and Solutions of perf)

安裝與配置問題 (Installation and Configuration Issues)

問題:在某些發(fā)行版中,perf工具可能未被預(yù)裝或安裝不完整。

解決方案:根據(jù)您的Linux發(fā)行版,使用相應(yīng)的包管理器安裝perf工具包。例如,在基于Debian的系統(tǒng)中,使用以下命令安裝:

#linux內(nèi)核系統(tǒng)
sudo apt-get install linux-tools-common linux-tools-$(uname -r)

#wsl:由于 WSL 不是真正的 Linux 內(nèi)核,因此無法使用 uname -r 命令獲取內(nèi)核版本。
sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-generic

數(shù)據(jù)采集和分析問題 (Data Collection and Analysis Issues)

問題:使用perf收集數(shù)據(jù)時,某些事件無法正常工作,或數(shù)據(jù)不準確。

解決方案:檢查內(nèi)核是否支持所需事件。請注意,某些事件可能僅在特定的硬件或內(nèi)核版本中受支持。如果問題仍然存在,嘗試使用不同的事件組合或降低采樣率。

報告與解讀問題 (Report and Interpretation Issues)

問題:使用perf生成的報告難以解讀或包含不易理解的符號。

解決方案:確保程序包含調(diào)試符號以便perf解析。使用編譯器選項(如-g)包含調(diào)試信息,并在生成報告時指定相應(yīng)的調(diào)試符號路徑。此外,學(xué)習(xí)perf報告中的各種輸出格式和視圖,以便根據(jù)需求定制報告。

兼容性與支持問題 (Compatibility and Support Issues)

問題:在虛擬化環(huán)境、容器環(huán)境或特定硬件平臺中,perf工具無法正常工作。

解決方案:檢查內(nèi)核是否支持perf工具及相應(yīng)的硬件性能計數(shù)器。在虛擬化和容器環(huán)境中,可能需要特定的配置選項以允許訪問主機的性能計數(shù)器。對于特定硬件平臺,如嵌入式系統(tǒng)或非x86架構(gòu),可能需要針對性地編譯perf工具或?qū)で笃渌鉀Q方案。

這些常見問題與解決方案有助于用戶更好地了解和解決在使用perf工具時可能遇到的問題,從而更有效地進行性能分析和優(yōu)化。

八、總結(jié)與展望 (Summary and Outlook)

perf工具的功能與優(yōu)勢 (Summary of Functions and Advantages of perf Tool)

perf工具是Linux下一款強大的性能分析工具,提供了豐富的性能指標和靈活的命令行選項,以滿足各種性能調(diào)優(yōu)需求。其優(yōu)勢包括:

  • 直接訪問硬件性能計數(shù)器,提供精確的性能數(shù)據(jù);
  • 支持多種事件類型,包括硬件、軟件和跟蹤點事件;
  • 提供全面的性能分析功能,如CPU、內(nèi)存和IO性能分析;
  • 支持多核性能分析和虛擬化/容器環(huán)境;
  • 可與其他性能分析工具結(jié)合使用,提供更深入的性能洞察。

其他性能分析工具及使用場景 (Introduction to Other Performance Analysis Tools and Usage Scenarios)

除了perf工具外,還有其他性能分析工具可供選擇:

  • gprof:GNU編譯器集合中的性能分析工具,主要用于分析程序的函數(shù)調(diào)用關(guān)系和執(zhí)行時間。
  • Valgrind:一款內(nèi)存調(diào)試和性能分析工具,可以檢測內(nèi)存泄漏、緩存未命中等問題。
  • SystemTap:一款跟蹤和分析內(nèi)核及用戶空間程序的工具,通過腳本語言編寫性能探針。
  • OProfile:一款系統(tǒng)范圍的性能分析工具,支持采樣分析和基于硬件性能計數(shù)器的分析。

根據(jù)不同的性能分析需求和場景,可以靈活選擇合適的工具。

對perf未來的期許 (Expectations for the Future of perf)

隨著硬件和軟件的發(fā)展,性能分析工具將不斷演進以滿足新的挑戰(zhàn)。對于perf工具,未來的發(fā)展方向可能包括:

  • 更強大的可視化功能:集成更豐富的圖形界面和可視化功能,以提高用戶體驗和分析效率。
  • 擴展到其他平臺:進一步支持不同架構(gòu)的硬件平臺,如ARM、RISC-V等,以滿足廣泛的應(yīng)用需求。
  • 人工智能結(jié)合:應(yīng)用機器學(xué)習(xí)和數(shù)據(jù)挖掘技術(shù),自動發(fā)現(xiàn)性能問題并提供優(yōu)化建議。
  • 更好的云原生支持:適應(yīng)云原生環(huán)境,提供針對微服務(wù)、容器和Serverless應(yīng)用的性能分析解決方案。

通過不斷創(chuàng)新和發(fā)展,perf工具將繼續(xù)為Linux用戶提供高效、準確的性能分析能力。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11164

    瀏覽量

    208468
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2248

    瀏覽量

    94179
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3221

    瀏覽量

    57502
收藏 人收藏

    評論

    相關(guān)推薦

    一文詳解Linuxperf_event

    Linux性能子系統(tǒng)在性能分析中非常有用。以下顯示了這篇文章中的perf子系統(tǒng)componenet 。
    發(fā)表于 10-11 09:04 ?2022次閱讀

    一文看懂Linux性能分析之perf原理

    最近線上運行的程序出現(xiàn)性能問題,但通過分析程序源代碼(Code Review),并找不到導(dǎo)致問題的根本原因。所以,只能借助強大的性能分析工具 perf 來找出問題所在。
    發(fā)表于 11-14 12:03 ?1686次閱讀

    Linux系統(tǒng)性能分析之Perf命令

    在開發(fā)板上使用apt安裝perf命令:
    發(fā)表于 07-14 15:24 ?1198次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)性能分析之<b class='flag-5'>Perf</b>命令

    NXP的Cortex-M系列為例做簡要介紹Linux開發(fā)

    單片機與應(yīng)用處理器的核心區(qū)別到底是什么呢?是核心主頻的差異?還是Linux系統(tǒng)的支持?又或者是處理器的架構(gòu)?本文將以NXP的Cortex-M系列為例做簡要介紹。
    的頭像 發(fā)表于 05-20 08:00 ?7985次閱讀
    NXP的Cortex-M系列為例做<b class='flag-5'>簡要</b><b class='flag-5'>介紹</b><b class='flag-5'>Linux</b>開發(fā)

    簡要介紹波特圖和根軌跡

    簡要介紹波特圖和根軌跡[hide][/hide]
    發(fā)表于 12-07 15:42

    簡要介紹WLAN 802.11ad的發(fā)展

    簡要介紹WLAN 802.11ad的發(fā)展
    發(fā)表于 05-21 07:15

    全志Tina中使用perf分析CPU使用率

    perf簡介Perf是是內(nèi)置于Linux內(nèi)核源碼樹中的性能剖析(profiling)工具。不僅可以用于應(yīng)用程序的性能統(tǒng)計分析,還可以用于內(nèi)核的性能統(tǒng)計和分析。它基于事件采樣原理,以性能事件為
    發(fā)表于 05-20 14:25

    LCD硬件的簡要介紹

    LCD硬件的簡要介紹,有需要的下來看看。
    發(fā)表于 02-18 15:17 ?0次下載

    你知道perf學(xué)習(xí)-linux自帶性能分析工具怎么用?

    Linux性能調(diào)優(yōu)工具,32內(nèi)核以上自帶的工具,軟件性能分析。在2.6.31及后續(xù)版本的linux內(nèi)核里,安裝perf非常的容易。
    發(fā)表于 05-16 14:54 ?2552次閱讀

    Linux kernel系統(tǒng)性能優(yōu)化工具Perf介紹

    之前有分享過自己工作中自己搭建的CPU監(jiān)控腳本等,但那個屬于是自己手工寫的一些腳本,比較粗淺的使用。后來就直接使用perf編譯到驅(qū)動里面,在設(shè)備中直接使用perf了,比起自己寫的腳本,效率直線提升
    的頭像 發(fā)表于 04-15 12:17 ?3456次閱讀

    perf 在內(nèi)核中的實現(xiàn)原理

    我們在《一文看懂Linux性能分析|perf 原理》一文中介紹過,perf 是基于采樣來對程序進行分析的。采樣的步驟如下:
    的頭像 發(fā)表于 10-17 09:24 ?2308次閱讀

    Coolbpf 在perf 事件中的增強

    Perf 是內(nèi)置于 Linux 內(nèi)核源碼樹中的性能剖析(profiling)工具。它基于事件采樣的原理,以性能事件為基礎(chǔ),支持針對處理器相關(guān)性能指標與操作系統(tǒng)相關(guān)性能指標的性能剖析。
    的頭像 發(fā)表于 10-25 09:00 ?1050次閱讀

    全球最高性能RISC-V處理器的Perf性能分析工具發(fā)布

    日前,為配合高性能RISC-V處理器昉·天樞Dubhe應(yīng)用,賽昉科技發(fā)布了“賽昉科技Perf性能分析工具”。Perf是基于Linux的開源性能分析工具,提供對硬件事件、跟蹤點、固件事件和動態(tài)探測
    的頭像 發(fā)表于 04-25 10:51 ?810次閱讀
    全球最高性能RISC-V處理器的<b class='flag-5'>Perf</b>性能分析工具發(fā)布

    Linux perf性能、實際應(yīng)用與案例

    Linux perf(性能分析工具)是一個功能強大且靈活的性能剩余工具,它可以在Linux系統(tǒng)上檢測和調(diào)試各種性能問題。Linux內(nèi)核集成了perf
    發(fā)表于 07-03 10:22 ?614次閱讀

    如何使用perf性能分析工具

    放在一起,是內(nèi)核級的工具。perf是在Linux上做剖析分析的首選工具。 perf命令介紹 perf 工具提供了一組豐富的命令來收集和分析性
    的頭像 發(fā)表于 11-08 15:36 ?1280次閱讀
    如何使用<b class='flag-5'>perf</b>性能分析工具