分析系統與程序的運作#

當除錯效能問題時,首先(通常也是唯一需要的)就是對系統運作進行 profiling。這會分析系統的資源使用率(resource utilization),從而指向有問題或需要最佳化的部分。

從高層級概觀開始#

使用程序檢視工具獲取系統的 CPU 和記憶體使用概觀:

  • Unixtop 命令
  • 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
  • 行級別 profiling:GCC 選項 -fprofile-arcs-ftest-coverage,檢視工具:gcov
  • Java profiling:Eclipse/NetBeans profiler 外掛、VisualVM、JProfiler、Java Mission Control
  • .NET profiling:CLR profiler

記憶體 profiling 工具

  • Valgrind(Unix)
  • VisualVMJava Mission Control(Java)

低層級效能監控

  • perfoprofileperfmon2 等工具可以監控 CPU 的 performance counters
  • 可偵測 cache misses、missed branch predictions、instruction fetch stalls 等

AOP 工具:AspectJ、Spring AOP 可用於自訂監控

重點回顧#

  • 透過檢查 CPU、I/O、記憶體使用率和飽和度來分析效能問題
  • 透過 profiling 程序的 CPU 和記憶體使用情況,縮小與效能問題相關的程式碼範圍