取自:Brendan Gregg
先概覽一下,右側有顏色的方塊代表在 Linux 的硬體或軟體 Component ,黑字分別是可以用的 tool 去 trace 相關的效能議題。
類型 | 描述 | 是否正常 |
---|---|---|
Minor page fault | 頁面不在 process 的 page table 中,但已在實體記憶體中(如 shared memory) | ✅ 正常,快速處理 |
Major page fault | 該頁尚未載入,必須從磁碟或 swap 中讀取 | ⚠️ 成本高,會造成延遲 |
Invalid (segfault) | 試圖存取不存在的頁面,或權限錯誤(如寫入唯讀區) | ❌ 系統會發出 SIGSEGV ,程式當掉 |
項目 | Page Fault(分頁錯誤) | Cache Miss(快取未命中) |
---|---|---|
發生時機 | 存取的虛擬頁面尚未載入至主記憶體(RAM) | 存取的資料不在 L1/L2/L3 cache 中 |
處理方式 | 由 OS 介入處理,可能從磁碟載入資料至 RAM | 由硬體自動從主記憶體(RAM)載入資料到快取中 |
成本(延遲) | 非常高,若需從磁碟(或 swap)載入頁面 | 中等偏低,取決於從哪層 cache 到 RAM 的距離 |
是否中斷程式 | 是,會觸發 exception,由作業系統處理 | 否,通常程式繼續執行,只是稍慢 |
發生原因 | 虛擬頁尚未對應至有效的實體記憶體 | 欲讀取的資料未被 cache 命中 |
與記憶體的關係 | 涉及虛擬記憶體管理與頁面交換 | 涉及 CPU cache 系統與資料區域性 |
發生路徑上的關聯:
CPU 想要讀某個位址 → 查 TLB 是否有對應實體頁(若無則 TLB miss)
若頁面尚未載入 RAM → Page Fault
若頁面已在 RAM,接下來查 cache → 若不在 cache → Cache Miss
如果在 cache → Cache Hit(最快)
總結一句話:
Cache Miss 是 CPU 找資料時,快取裡沒命中,需要去 RAM。
Page Fault 是 CPU 找資料時,那頁根本還不在 RAM,需要作業系統把它從磁碟讀進 RAM。
Introduction to Memory Management in Linux
項目名稱 | 中文名稱 | 說明 | 常見用途 |
---|---|---|---|
cycles |
CPU 週期數 | 處理器執行的總時鐘週期數 | 評估程式執行時間(與 CPU 頻率相關) |
instructions |
指令數 | 已執行的 CPU 指令總數 | 搭配 cycles 計算 IPC(每週期指令數) |
minor-faults |
次級缺頁 | 記憶體頁已存在但尚未映射進行處理(無需 I/O) | 分析虛擬記憶體效能 |
major-faults |
重大缺頁 | 缺頁時需從磁碟讀取資料(需進行 I/O) | 檢查是否頻繁觸發記憶體分頁 |
dTLB-loads |
資料 TLB 載入 | 嘗試載入資料的 TLB(Translation Lookaside Buffer)記錄次數 | 檢查記憶體虛實轉換快取的使用狀況 |
dTLB-load-misses |
資料 TLB 失敗 | 資料存取時未命中 TLB,需查詢頁表 | 觀察 TLB 效率,失敗率高表示轉換緩慢 |
iTLB-loads |
指令 TLB 載入 | 嘗試載入指令的 TLB 次數 | 評估程式碼虛擬位址快取命中率 |
iTLB-load-misses |
指令 TLB 失敗 | 指令存取時未命中 TLB,需查詢頁表 | 指令分頁效率分析,常見於大型 binary |
page-faults |
頁面錯誤總數 | 包含 minor 與 major fault 的總數 | 觀察程式在記憶體管理上的負擔 |
cache-references |
快取存取次數 | CPU 對 L1/L2/LLC 等快取的總存取次數 | 衡量快取使用頻繁程度 |
cache-misses |
快取未命中次數 | CPU 存取快取時未命中的次數 | 評估資料/指令是否常被 cache 命中 |
階段 | 目的 | 常用指令 / 工具 |
---|---|---|
快速量化 (粗粒度) | 先確認 CPU/記憶體/IO 是否飽和,判斷是哪一類瓶頸 | top 、htop 、vmstat 、iostat 、dstat |
抽樣分析 (中粒度) | 找出「最耗時的函式/路徑」 | perf stat / top / record + report 、BPFtrace 、FlameGraph |
精細診斷 (細粒度) | 深入微架構(Cache、分支、TLB 等)、鎖競爭、系統呼叫 | perf stat -e ... 、perf annotate 、perf c2c / lock 、ftrace 、eBPF + BCC/BPFtrace 、valgrind (massif/cachegrind) |
perf、ftrace、eBPF、kgdb、kprobes
效能分析的本質是:
🔑 效能(Performance)= 有用的工作(Useful Work)÷ 所花的時間(Time)
換句話說:
效能可以被分解為最根本的三個資源維度:
資源類型 | 代表指標 | 第一性原理的根本限制 |
---|---|---|
CPU | 指令數量、IPC、使用率 | CPU 是有限的時脈驅動狀態機,只能每 cycle 做有限工作 |
Memory | cache miss、TLB、page fault | 記憶體存取受到階層結構與時延限制(memory wall) |
I/O | IO wait、latency | 裝置響應時間、佇列設計、吞吐量有限 |
資源類型 | 第一性限制(根本物理限制) | 常見瓶頸現象 |
---|---|---|
🖥️ CPU | 每個 cycle 執行固定數量的指令 | CPU 飽和、IPC 太低 |
💾 記憶體 | 存取速度受到階層結構與 latency 限制 | Cache miss、Memory wall、TLB miss |
🔄 I/O | 外部裝置存取速度受限於硬體 | I/O wait、device latency |
在資源限制的前提下,盡可能提升有用工作的比例,減少無效等待或浪費。
基本現象 | 第一性原因解釋 |
---|---|
CPU 飽和 | 指令數量過多、無法並行處理、等待其他資源(如記憶體) |
Cache Miss | 資料位置分散、不符合 spatial/temporal locality |
Page Fault | 虛擬記憶體機制導致非預期 I/O(memory access latency) |
Context Switch | 多任務切換導致保存/還原狀態、TLB/cache flush 等 overhead |
Lock Contention | 多執行緒同時搶奪資源,造成序列化 |
I/O Bottleneck | 磁碟、網路等裝置 throughput 無法滿足需求 |
階段 | 你在問的問題 | 常見工具 | 工具特性 |
---|---|---|---|
① 基本時間量測 | 程式整體到底花多少時間? | time , hyperfine |
快速簡單,取得初步效能數據 |
② 系統資源使用 | CPU/Memory/I/O 哪個資源是瓶頸? | top , htop , vmstat , iotop |
快速定位整體瓶頸資源 |
③ CPU 細部分析 | IPC 高嗎?Cycles 浪費在哪? | perf stat , ocperf , pmu-tools |
提供細緻的 CPU 硬體指標 |
④ 熱點函式定位 | 哪個函式或程式段落最耗時? | perf record/report , gprof , FlameGraph |
提供函式級別精確定位 |
⑤ 函式呼叫關係 | 函式呼叫誰、多少次、每次多久? | uftrace , ltrace |
清楚展示 call graph |
⑥ 記憶體耗用 | 記憶體用多少?峰值在哪裡? | valgrind massif , heaptrack |
檢查記憶體峰值、leak |
⑦ Cache行為分析 | L1/L2 cache有效使用嗎? | cachegrind , callgrind , perf c2c |
展示 Cache 細部效能 |
⑧ 低負擔線上追蹤 | Production 可用的長期低成本追蹤? | eBPF (bcc , bpftrace ) |
長期觀測,幾乎不影響效能 |
觀察輸出行為
建立模型
找出資源瓶頸
回推到根本原因
優化策略根據本質制定
perf
是 Linux 下用於分析效能瓶頸的核心工具,適用於從系統層級到函式層級的 CPU profiling、cache miss 分析與系統事件統計。
perf stat
觀察 IPC、cache miss、cyclesperf stat
量化基本效能perf top
即時觀察熱點,再進行 perf record
深入分析ftrace
是 Linux kernel 內建的 tracing framework,用於追蹤核心行為(context switch、IRQ latency、function call、syscall 等),可幫助系統工程師深入分析排程延遲、系統抖動(jitter)與低階效能問題。
perf
搭配進行全系統觀察也可透過 wrapper 工具如 trace-cmd
、kernelshark
提供更佳的使用體驗與 GUI 支援。
sched_switch
分析上下文切換時間trace-cmd report
彙整更清晰的事件序列ftrace
佐證火焰圖是一種視覺化工具,用於顯示 CPU 使用的函式堆疊與時間分佈。它可以幫助你一眼看出哪些函式佔用最多執行時間,適合用於分析 hot path 與瓶頸函式。
perf
或其他 trace 工具收集資料valgrind
是一套動態分析工具,最常用於記憶體錯誤偵測、資源洩漏分析與 cache 效能模擬。
核心工具包含:
memcheck
: 偵測未初始化記憶體讀取、非法存取、記憶體洩漏等問題cachegrind
: 分析 cache miss、分支預測命中率callgrind
: 分析函式呼叫次數與執行時間(可搭配 KCachegrind 視覺化)callgrind
作為簡易函式 profiling 工具cachegrind
模擬最佳化潛力在生產環境中,程式可能會因為 segmentation fault、abort、assertion fail 等異常崩潰。當你無法重現這些錯誤時,core dump 是唯一可以還原當下狀態的線索來源。
使用 gdb
搭配 core dump 可以:
-g
編譯選項與 INHIBIT_PACKAGE_STRIP = "1"
(如 Yocto)bt
並儲存堆疊