Perf使用詳解

Perf 工具深度解析

Perf(Performance Counters for Linux)是 Linux 系統的性能分析工具,基于內核的 perf_event 子系統,通過硬件性能計數器(PMC)、軟件事件和跟蹤點(tracepoints)實現全方位性能監控。


一、工作原理與實現機制

1. 核心組件
組件作用
硬件性能計數器利用 CPU 的 PMU(Performance Monitoring Unit)統計指令周期、緩存命中/失效等事件。
軟件事件內核插樁統計上下文切換、缺頁異常等軟件行為(如 context-switches)。
跟蹤點靜態內核探針(如 sched:sched_switch),記錄特定代碼路徑的執行信息。
kprobes/uprobes動態內核/用戶空間探針,支持自定義函數級跟蹤。
2. 數據采集流程
+----------------+       +-------------------+       +-----------------+
| 配置事件        | ----> | perf_event_open() | ----> | 內核事件子系統   |
| (cycles, cache |       | (系統調用)        |       | (PMU/軟件計數器) |
| misses, etc.)   |       +-------------------+       +-----------------+
+----------------+                     |v
+------------------+     mmap()      +--------------+
| 用戶空間工具      | <------------- | 環形緩沖區     |
| (perf record/stat)|                 | (存儲樣本)    |
+------------------+                 +--------------+
3. 關鍵機制
  • 環形緩沖區:采樣數據通過無鎖環形緩沖(避免系統調用開銷)傳遞到用戶空間。
  • 采樣模式
    • 計數模式:累計事件發生次數(perf stat)。
    • 中斷采樣:事件達到閾值時觸發中斷,記錄指令指針/IP(perf record)。
  • 符號解析:通過 /proc/kallsyms 或 ELF 文件將地址映射為函數名。

二、命令大全與使用示例

1. 常用命令總結
命令功能常用選項
perf stat統計事件發生的絕對次數-e (指定事件), -p (PID), -a (全局)
perf record采樣并保存數據到 perf.data-g (調用棧), -F (采樣頻率), -o (輸出文件)
perf report解析 perf.data 生成報告--stdio (文本報告), -n (顯示樣本數)
perf top實時顯示熱點函數-e (事件), -K (隱藏內核符號)
perf list列出支持的事件--details (顯示事件詳情)
perf script導出采樣數據為腳本格式-i (輸入文件), -F (自定義字段)
perf trace類似 strace,跟蹤系統調用-p (PID), -e (過濾系統調用)
perf annotate匯編代碼級注解--stdio (文本模式), -s (符號)
2. 詳細示例

Perf 典型使用場景及命令詳解

2.1 CPU 性能分析
場景命令示例說明
CPU 熱點函數分析perf top -e cycles -p <PID>實時查看進程的熱點函數
調用鏈分析perf record -F 99 -g -p <PID> -o perf.data; perf report --stdio記錄調用棧并生成文本報告
多核負載均衡分析perf stat -e sched:sched_migrate_task -a sleep 10監控任務在 CPU 核間的遷移情況
IPC 指標分析perf stat -e cycles,instructions -p <PID> -- sleep 5計算指令/周期比 (IPC = instructions/cycles)

示例:CPU 瓶頸診斷

# 1. 查找 CPU 占用最高的進程
perf top# 2. 對高負載進程 (PID 1234) 進行采樣
perf record -F 997 -g -p 1234 -o cpu_hotspot.data -- sleep 30# 3. 生成帶調用棧的報告
perf report -i cpu_hotspot.data --stdio --no-children

輸出片段

# Overhead  Command  Shared Object     Symbol
# ........  .......  ................  ................................
#62.15%  nginx    nginx             [.] ngx_http_process_request|---ngx_http_process_request|          |--45.32%-- ngx_http_core_content_phase|          ngx_http_proxy_handler|          ||          |--38.71%-- ngx_http_upstream_connect|          |          __connect

2.2 內存子系統分析
場景命令示例說明
緩存命中率分析perf stat -e cache-references,cache-misses <command>統計 L1/L2/L3 緩存效率
內存帶寬分析perf stat -e uncore_imc_0/cas_count_read/,uncore_imc_0/cas_count_write/監控 DDR 內存讀寫帶寬 (需 Intel PMU)
缺頁異常分析perf stat -e page-faults,minor-faults,major-faults -p <PID>區分次/主缺頁異常

示例:內存敏感型應用優化

# 1. 檢測緩存效率
perf stat -e \L1-dcache-load-misses,LLC-load-misses,dTLB-load-misses \./memory_intensive_app# 2. 輸出結果35,421,632  L1-dcache-load-misses     #  12.45% of all L1-dcache hits  8,765,432  LLC-load-misses           #   3.21% of all LL-cache hits1,234,567  dTLB-load-misses          #   0.45% of all dTLB cache hits

2.3 I/O 性能分析
場景命令示例說明
塊設備 I/O 延遲perf record -e block:block_rq_issue,block:block_rq_complete -a跟蹤塊設備請求生命周期
文件系統操作跟蹤perf record -e ext4:*,xfs:* -a捕獲特定文件系統事件
系統調用分析perf trace -e 'read,write,openat' -p <PID>監控文件相關系統調用

示例:磁盤 I/O 瓶頸診斷

# 1. 跟蹤塊設備事件
perf record -e block:block_rq_issue -e block:block_rq_complete -a# 2. 生成延遲報告
perf script | awk '/block_rq_issue/{ts[$5]=$4}/block_rq_complete/{if(ts[$5])printf "%.2f ms\n", ($4-ts[$5])*1000}'

輸出

8.23 ms  # I/O 請求延遲
12.45 ms
5.67 ms

2.4 網絡性能分析
場景命令示例說明
網絡協議棧跟蹤perf record -e skb:kfree_skb -e net:net_dev_xmit -a監控丟包和發送事件
TCP 函數跟蹤perf probe --add tcp_v4_connect; perf record -e probe:tcp_v4_connect動態跟蹤 TCP 連接建立
網絡延遲分析perf trace -e sendto,recvfrom -p <PID> -T跟蹤網絡收發系統調用時間戳

示例:網絡丟包分析

# 1. 創建丟包檢測探針
sudo perf probe --add 'kfree_skb reason'# 2. 記錄丟包事件
sudo perf record -e probe:kfree_skb -aR -o net_drop.data# 3. 分析丟包原因
sudo perf script -i net_drop.data | awk '{print $5}' | sort | uniq -c | sort -nr

輸出

 1423 TCP: Too many orphaned sockets890 NETDEV WATCHDOG: enp0s3 transmit timeout321 ICMP: Destination unreachable

2.5 鎖與同步分析
場景命令示例說明
鎖競爭分析perf record -e lock:lock_acquire -e lock:lock_release -g -p <PID>跟蹤鎖獲取/釋放事件
調度延遲分析perf sched record -p <PID>; perf sched latency分析任務調度延遲
中斷分析perf record -e irq:irq_handler_entry -e irq:irq_handler_exit -a跟蹤中斷處理時間

示例:鎖競爭診斷

# 1. 記錄鎖事件
perf record -e lock:lock_acquire -e lock:lock_release -g -p 5678 -o locks.data# 2. 生成競爭報告
perf lock report -i locks.data --combine-locks --sort contended

輸出

                Name   acquired  contended   avg wait (ns)
----------------------------------------------------------
&sb->s_type->i_lock    14235      4231        15234&rq->lock      8765       2109         8765mm->page_table_lock 6543     987          5432

2.6 火焰圖生成
perf record -F 99 -a -g -- sleep 30
perf script > out.perf
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > flame.svg
2.7 Perf 工作流程圖
CPU 瓶頸
內存瓶頸
I/O 瓶頸
網絡問題
鎖競爭
確定分析目標
性能問題類型
perf record/top
perf stat -e cache
perf trace -e block
perf probe + net events
perf lock
生成火焰圖/報告
緩存命中率報告
I/O 延遲直方圖
丟包原因統計
鎖競爭分析
優化熱點函數
調整數據布局
優化 I/O 模式
調整網絡參數
減少鎖粒度

2.8 高級技巧
  1. PEBS 精確采樣

    perf record -e cycles:pp -c 1000000 -p <PID>  # 每100萬周期采樣一次
    
  2. 事件分組統計

    perf stat -e '{cycles,instructions,branch-misses}' -r 5 ./program
    
  3. 時間戳跟蹤

    perf record -e sched:sched_switch -T -a -- sleep 10
    perf script --ns
    
  4. 跨進程跟蹤

    perf record -e 'sched:sched_wakeup,sched:sched_switch' -a
    
  5. 用戶空間探針

    perf probe -x /path/to/bin 'func_name'
    perf record -e probe_bin:func_name -a
    

三、Perf 使用流程圖

計數模式
采樣模式
實時模式
動態跟蹤
啟動分析
選擇模式
perf stat
perf record
保存到 perf.data
perf report/report
生成文本/圖形報告
perf top
perf probe + record
perf script 分析日志
優化代碼/系統

四、高級技巧

  1. 事件修飾符
    • u:僅用戶空間,如 perf stat -e cycles:u
    • k:僅內核空間
  2. 精確采樣
    perf record -e cycles:pp -p 1234  # 使用 PEBS 精確采樣
    
  3. 多事件分析
    perf stat -e cycles,instructions,cache-references,cache-misses ls
    

五、注意事項

  • 權限要求:部分事件需要 CAP_PERFMONroot 權限。
  • 符號表:用戶程序需編譯時添加 -g 選項(保留調試符號)。
  • 內核版本:不同內核版本支持事件可能不同(perf list 查看)。

通過靈活組合命令,Perf 可定位 CPU 瓶頸、內存延遲、I/O 問題等,是 Linux 性能調優的核心工具。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93427.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windchill 11 Enumerated Type Customization Utility-枚舉類型自定義實用程序

一、Enumerated Type Customization Utility 枚舉類型自定義實用程序&#xff0c;可用于添加或編輯枚舉類型的值&#xff0c;在Windchill 12.0中可直接在類型和屬性管理中編輯&#xff0c;如下圖所示&#xff0c;而在Windchill 11.0中只能通過windchill shell啟動程序&#xff…

git疑問,暫時記錄

有時候把dev本地分支搞亂了,多出幾個提交,好像在遠程倉庫,rebase dev到本地dev,就恢復了,然后再把我開發分支合并過去就ok,就不會多出幾個重復的提交 在自己分支開發提交數據后,不push到遠程倉庫 然后合并到dev分支,推dev分支到遠程倉庫然后在自己分支,rebase到自己分支,然后再…

Java 大視界 -- 基于 Java 的大數據分布式計算在氣象災害預警與應急響應中的應用

Java 大視界 -- 基于 Java 的大數據分布式計算在氣象災害預警與應急響應中的應用引言&#xff1a;Java 筑起氣象防災減災的數字長城正文&#xff1a;Java 構建的氣象智慧防御體系一、氣象大數據的 Java 基座&#xff1a;從采集到存儲的全鏈路優化1.1 多源異構數據的實時匯聚1.2…

MySQL黑盒子研究工具 strace

strace是什么&#xff1f; 按照 strace 官網的描述, strace 是一個可用于診斷、調試和教學的 Linux 用戶空間跟蹤器。我們用它來監控用戶空間進程和內核的交互&#xff0c;比如系統調用、信號傳遞、進程狀態變更等。 strace 底層使用內核的 ptrace 特性來實現其功能。 strace能…

【運維進階】實施任務控制

實施任務控制 在 Ansible 中&#xff0c;“實施任務控制” 通常指的是對任務執行流程的控制&#xff0c;比如&#xff1a; 條件執行&#xff08;when&#xff09; 循環執行&#xff08;with_items / loop&#xff09; 錯誤處理&#xff08;block / rescue / ignore_errors&…

Java 中的線程中斷詳解

Java 中的線程中斷1、什么是線程中斷2、如何觸發線程中斷3、如何處理線程中斷3.1 線程中斷相關的核心方法3.2 處理中斷的典型方式3.3 注意事項4、線程中斷與線程終止的區別5、線程中斷的應用場景5.1 長時間運行任務的取消5.2 阻塞操作的快速響應5.3 服務或線程池的優雅關閉5.4 …

【LeetCode題解】LeetCode 33. 搜索旋轉排序數組

【題目鏈接】 33. 搜索旋轉排序數組 【題目描述】 【題解】 對于一個有序數組&#xff0c;我們可以使用二分查找算法來查找某個元素&#xff0c;具體的算法模板可以參考【算法基礎課-算法模板1】基礎算法中二分查找一節的內容。 然而&#xff0c;在這道題目中&#xff0c;數組…

使用 Serverless 架構快速構建基于 Iceberg 的事務型實時數據湖

文章目錄1. 背景介紹2. 架構設計3. 方案實現3.1 CDC3.1.1 自定義插件3.1.2 配置 MSK Connect3.2 實時攝入3.2.1 Glue 實現方案3.2.1.1 在 Glue 中創建 Kafka connection3.2.1.2 Glue Streaming 任務3.2.2 EMS Serverless 實現方案3.3 使用 Athena 查詢 Iceberg 表3.3.1 查詢3.3…

Java零基礎筆記20(Java高級技術:單元測試、反射、注解、動態代理)

1.單元測試2.反射2.1 反射第一步&#xff1a;加載類&#xff0c;獲取類的字節碼&#xff0c;class對象2.2 獲取類中的成分&#xff08;構造器、成員變量、成員方法&#xff09;&#xff0c;并對其進行操作獲取構造器的作用&#xff1a;獲取成員變量的作用&#xff1a;獲取成員…

WinDbg 調試

安裝 Windows 調試器 WinDbg 是一種調試器,可用于分析故障轉儲、調試實時用戶模式和內核模式代碼,以及檢查 CPU 寄存器和內存。 此最新版本具有更新的界面、完全現成的腳本功能、可擴展的調試數據模型、內置的時間旅行調試(TTD)支持和許多其他功能,具有更現代的用戶體驗。…

topographic terrain

在中文語境中&#xff0c;topographic&#xff08;地形學&#xff09;和 terrain&#xff08;地形&#xff09;這兩個詞都與地表特征相關&#xff0c;但它們的含義和使用場景有細微差別。以下是它們的區別&#xff1a; 1. 定義Topographic&#xff08;地形學的&#xff09;&…

SpringCloud 06 服務容錯 Sentinel

雪崩&#xff1a;一個微小的故障引起系統其他部分出現故障&#xff0c;最終使整個系統不可用。 雪崩一般經歷以下三個階段&#xff1a; 實例能力出現過載。可能是 bug 導致性能下降&#xff0c;可能是實例宕機&#xff0c;可能是突發流量&#xff0c;總之實例無法處理如此多請求…

Qt同步處理業務并禁用按鈕

1.界面代碼 //按鈕1 void Dialog::on_pushButton1_clicked() {qDebug("pushButton1 clicked start");enableBtns(false);//禁用按鈕qDebug("pushButton1 do sth start");QThread::sleep(5);//休眠&#xff0c;作為同步處理業務qDebug("pushButton1 do…

虛擬專用網技術

一、需求背景物理聯通&#xff1a;實現不同物理位置網絡的連接基礎。網絡聯通&#xff1a;在物理連接基礎上&#xff0c;實現數據等信息的傳輸互通。二、虛擬專用網簡介定義虛擬私有網絡是依靠互聯網服務提供商&#xff08;ISP&#xff09;或其他網絡服務提供商&#xff08;NSP…

GANs生成對抗網絡生成手寫數字的Pytorch實現

目錄 一、第三方庫導入 二、數據集準備 三、使用轉置卷積的生成器 四、使用卷積的判別器 五、生成器生成圖像 六、主程序 七、運行結果 7.1 生成器和判別器的損失函數圖像 7.2 訓練過程中生成器生成的圖像 八、完整的pytorch代碼 由于之前寫gans的代碼時&#xff0c;…

ubuntu 通過NAT模式上網

這里必須使用VMnet8 設置為NAT模式 下面設置Ip地址區域ubuntu ip地址設置來自于上面

盲盒抽谷機小程序系統開發:從0到1的完整方法論

開發一款成功的盲盒抽谷機小程序系統&#xff0c;需兼顧技術實現、用戶體驗與商業邏輯。本文將從需求分析、UI/UX設計、技術架構、測試上線到運營增長&#xff0c;系統梳理從0到1的完整方法論。需求分析&#xff1a;明確“為誰而做”盲盒抽谷機的核心用戶是18-35歲的二次元愛好…

web開發,在線%射擊比賽管理%系統開發demo,基于html,css,jquery,python,django,三層mysql數據庫

經驗心得 兩業務單&#xff0c;業務crud開發很簡單了&#xff0c;自行學習&#xff0c;我說一下學習流程。什么是前端&#xff0c;用到那些技術html,css,javascript分別是什么&#xff1f;進階jquery,bootstrap,各種常見前端組件又是什么&#xff0c;前端框架react,angular以及…

Centos9傻瓜式linux部署CRMEB 開源商城系統(PHP)

服務器環境推薦要求* Nignx&#xff08;必須&#xff09; * PHP 7.1 ~ 7.4&#xff08;必須此版本內&#xff0c;版本過大會警告不兼容&#xff09; * MySQL 5.7 &#xff5e; 8.0&#xff08;必須&#xff09; * Redis&#xff08;非必須&#xff09;后臺頁面展示&#xff1a;…

AI 云電競游戲盒子:從“盒子”到“云-端-芯”一體化競技平臺的架構實踐

摘要 AI 云電競游戲盒子&#xff08;以下簡稱“電競盒”&#xff09;不再是一臺簡單的客廳游戲主機&#xff0c;而是一套以 AI 調度為核心、以云原生架構為骨架、以邊緣渲染為肌肉、以端側感知為神經的“云-端-芯”協同競技系統。本文基于 2024 年 Q2 落地的量產方案&#xff0…