分析系統與程序的運作#
當除錯效能問題時,首先(通常也是唯一需要的)就是對系統運作進行 profiling。這會分析系統的資源使用率(resource utilization),從而指向有問題或需要最佳化的部分。
從高層級概觀開始#
使用程序檢視工具獲取系統的 CPU 和記憶體使用概觀:
- Unix:
top命令 - Windows:Task Manager
根據觀察結果判斷瓶頸方向:
- 高 CPU 使用率(例如單核心 90%):集中分析處理邏輯
- 低 CPU 使用率(例如單核心 10%):可能是 I/O 延遲造成的
多核心電腦通常報告的是所有核心的總負載。如果處理的是單執行緒程序,需要將閾值除以 CPU 核心總數。例如八核心系統上,一個程序佔滿單核心會顯示為 12%(100%/8)。
檢查記憶體與飽和度#
- 記憶體使用率接近 100% 可能導致記憶體分配失敗或因 virtual memory paging 導致效能下降
- Linux 系統會積極使用可用記憶體作為 buffer cache,因此應將
buffers加入你認為的可用記憶體量中 - 對於設計在接近最大容量運行的系統,需要關注 saturation(飽和度)——超過資源可服務水平的需求量
各資源的飽和度指標#
- CPU:load 高於核心數(Unix)或 Performance Monitor 的 Processor Queue Length(Windows)
- 記憶體:virtual memory pages 被寫出到磁碟的速率
- 網路 I/O:丟棄的封包和重傳次數
- 儲存 I/O:請求佇列長度和操作延遲
深入分析問題程序#
確定哪個程序有問題後,進一步 profiling 其行為:
CPU profiling 工具:
- Statistical profiler:定期中斷程式執行,記錄程式在哪裡花費最多時間
- Graph-based profiler:在每個函式的開頭和結尾插入計時器,建立呼叫圖
- GCC 選項:
-pg,檢視工具:gprof
- GCC 選項:
- 行級別 profiling:GCC 選項
-fprofile-arcs和-ftest-coverage,檢視工具:gcov - Java profiling:Eclipse/NetBeans profiler 外掛、VisualVM、JProfiler、Java Mission Control
- .NET profiling:CLR profiler
記憶體 profiling 工具:
- Valgrind(Unix)
- VisualVM 和 Java Mission Control(Java)
低層級效能監控:
perf、oprofile、perfmon2等工具可以監控 CPU 的 performance counters- 可偵測 cache misses、missed branch predictions、instruction fetch stalls 等
AOP 工具:AspectJ、Spring AOP 可用於自訂監控
重點回顧#
- 透過檢查 CPU、I/O、記憶體使用率和飽和度來分析效能問題
- 透過 profiling 程序的 CPU 和記憶體使用情況,縮小與效能問題相關的程式碼範圍