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

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

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

Linux perf 簡(jiǎn)要介紹

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

一、引言 (Introduction)

簡(jiǎn)要介紹Linux perf (Brief Introduction to Linux perf)

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

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

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

了解并掌握perf工具對(duì)Linux用戶(hù)來(lái)說(shuō)至關(guān)重要,原因有以下幾點(diǎn):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

$ perf list

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

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

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

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

$ perf stat [options] [command]

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

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

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

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

$ perf record [options] [command]

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

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

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

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

$ perf report [options]

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

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

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

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

$ perf annotate [options] [symbol]

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

  1. -i 或 --input:指定要讀取的輸入文件,默認(rèn)為 perf.data。
  2. -s 或 --symbol:指定要注解的符號(hào)(函數(shù))名稱(chēng)。
  3. -d 或 --dsos:指定要注解的動(dòng)態(tài)共享對(duì)象(DSO)名稱(chēng)。
  4. -P 或 --pretty:指定輸出格式,如raw、normal等。
  5. --stdio:以文本模式顯示注解(而非 TUI 模式)。
  6. --tui:以 TUI 模式顯示注解(默認(rèn)方式)。
  7. --gtk:以 GTK 模式顯示注解。
  8. --no-source:僅顯示匯編代碼,不顯示源代碼。
  9. --group:將指定事件作為事件組進(jìn)行注解。
  10. -f 或 --force:強(qiáng)制解析文件,即使它看起來(lái)無(wú)效或損壞。
  11. --show-total-period:顯示每個(gè)符號(hào)的總周期數(shù)。
  12. -k 或 --vmlinux:指定內(nèi)核符號(hào)表文件(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:指定百分比類(lèi)型,如:local, global等。
  17. --percent-limit:僅顯示超過(guò)指定百分比的項(xiàng)。

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

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

$ perf top [options]

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

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

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

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

$ perf bench [options] [subcommand]

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

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

perf bench 命令下有幾個(gè)子命令,可以用于運(yùn)行不同類(lèi)型的基準(zhǔn)測(cè)試:

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

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

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

$ perf trace [options] [command]

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

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

以上介紹的是perf工具的一些基本命令和用法,通過(guò)這些命令,用戶(hù)可以針對(duì)不同場(chǎng)景進(jìn)行性能分析.

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

CPU性能分析 (CPU Performance Analysis)

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

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

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

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

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

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

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

IO性能分析 (IO Performance Analysis)

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

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

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

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

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

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

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

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

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

$ perf top

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

硬件性能評(píng)估 (Hardware Performance Evaluation)

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

$ perf bench mem memcpy

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

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

五、perf生成火焰圖

生成火焰圖步驟

1. 運(yùn)行perf

在終端中輸入以下命令:

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

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

生成火焰圖

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 //通過(guò)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是兩個(gè)Perl腳本,用于將perf采集到的數(shù)據(jù)轉(zhuǎn)換成火焰圖的格式。perf.svg是生成的火焰圖文件名。

查看火焰圖

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

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

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

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

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

$ perf stat -e rNNN -- ./my_program

其中NNN是原始事件代碼。此外,還可以使用事件組合來(lái)關(guān)注多個(gè)相關(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分析各個(gè)核心的性能。以下示例展示了如何使用perf stat命令監(jiān)控特定CPU核心上的事件:

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

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

長(zhǎng)時(shí)間監(jiān)控與分析 (Long-Term Monitoring and Analysis)

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

$ 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仍然可以提供準(zhǔn)確的性能分析。例如,在Docker容器中使用perf工具:

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

這將在容器內(nèi)運(yùn)行perf,允許訪(fǎng)問(wèn)主機(jī)的性能計(jì)數(shù)器。

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

七、常見(jiàn)問(wèn)題與解決方案 (Common Problems and Solutions of perf)

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

問(wèn)題:在某些發(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)核,因此無(wú)法使用 uname -r 命令獲取內(nèi)核版本。
sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-generic

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

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

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

報(bào)告與解讀問(wèn)題 (Report and Interpretation Issues)

問(wèn)題:使用perf生成的報(bào)告難以解讀或包含不易理解的符號(hào)。

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

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

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

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

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

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

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

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

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

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

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

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

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

對(duì)perf未來(lái)的期許 (Expectations for the Future of perf)

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

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

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

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

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208717
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2253

    瀏覽量

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

    關(guān)注

    37

    文章

    3237

    瀏覽量

    57547
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文詳解Linuxperf_event

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

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

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

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

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

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

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

    簡(jiǎn)要介紹波特圖和根軌跡

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

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

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

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

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

    LCD硬件的簡(jiǎn)要介紹

    LCD硬件的簡(jiǎn)要介紹,有需要的下來(lái)看看。
    發(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 ?2576次閱讀

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

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

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

    我們?cè)凇兑晃目炊?b class='flag-5'>Linux性能分析|perf 原理》一文中介紹過(guò),perf 是基于采樣來(lái)對(duì)程序進(jìn)行分析的。采樣的步驟如下:
    的頭像 發(fā)表于 10-17 09:24 ?2368次閱讀

    Coolbpf 在perf 事件中的增強(qiáng)

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

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

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

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

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

    如何使用perf性能分析工具

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