面對一個問題程序,最好採用自頂向下的策略。先總體看看該程序運行時各類統計事件的大概,再針對某些方向深刻細節。而不要一會兒扎進瑣碎細節,會一葉障目的。frontend
對於優化本身寫的代碼,cpu bound 型 和 IO bound 型是不同的:函數
/*******************************************************************************/ $ perf stat ./Joseph_ring Performance counter stats for './Joseph_ring': 19.755435 task-clock # 0.000 CPUs utilized 429 context-switches # 0.022 M/sec 5 CPU-migrations # 0.000 M/sec 137 page-faults # 0.007 M/sec 27,255,530 cycles # 1.380 GHz <not counted> stalled-cycles-frontend <not counted> stalled-cycles-backend 6,521,404 instructions # 0.24 insns per cycle 1,157,604 branches # 58.597 M/sec 161,429 branch-misses # 13.95% of all branches 439.901478124 seconds time elapsed /*******************************************************************************/
task-clock:CPU 利用率,該值高,說明程序的多數時間花費在 CPU 計算上而非 IO。優化
Context-switches:進程切換次數,記錄了程序運行過程當中發生了多少次進程切換,頻繁的進程切換是應該避免的。unix
Cache-misses:程序運行過程當中整體的 cache 利用狀況,若是該值太高,說明程序的 cache 利用很差code
CPU-migrations:表示進程 t1 運行過程當中發生了多少次 CPU 遷移,即被調度器從一個 CPU 轉移到另一個 CPU 上運行。orm
Cycles:處理器時鐘,一條機器指令可能須要多個 cycles進程
Instructions: 機器指令數目。事件
IPC:是 Instructions/Cycles 的比值,該值越大越好,說明程序充分利用了處理器的特性。it
branches:待查io
branch misses:待查
例如系統中最耗時的內核函數或某個用戶進程:
/*******************************************************************************/ $perf top samples pcnt function DSO _______ _____ ______________________________ __________________ 133.00 9.4% system_call [kernel.kallsyms] 126.00 8.9% __ticket_spin_lock [kernel.kallsyms] 49.00 3.5% schedule [kernel.kallsyms] 49.00 3.5% __ticket_spin_unlock [kernel.kallsyms] 43.00 3.0% pthread_mutex_lock libpthread-2.13.so 40.00 2.8% _nv027676rm [nvidia] 40.00 2.8% __pthread_mutex_unlock_usercnt libpthread-2.13.so 38.00 2.7% __memset_sse2 libc-2.13.so 32.00 2.3% unix_poll [kernel.kallsyms] 25.00 1.8% __sincos libm-2.13.so 24.00 1.7% update_curr [kernel.kallsyms] 24.00 1.7% sched_clock_local [kernel.kallsyms] /**********************************************************************************/ ### **perf record**
記錄單個函數級別的統計信息,並使用 perf report 來顯示統計結果,以此能夠找到熱點:
/**********************************************************************************/ # Events: 46 cpu-clock # # Overhead Command Shared Object Symbol # ........ ........... ................. ...................... # 63.04% Joseph_ring [kernel.kallsyms] [k] 0xc10e7ef2 6.52% Joseph_ring libc-2.13.so [.] __GI_vfprintf 4.35% Joseph_ring libc-2.13.so [.] __printf 4.35% Joseph_ring libc-2.13.so [.] _IO_new_file_xsputn 2.17% Joseph_ring libc-2.13.so [.] _itoa_word /**********************************************************************************/
perf record -e cpu-clock -g 給出函數的調用關係,以便於找到次級熱點:
/**********************************************************************************/ # Events: 47 cpu-clock # # Overhead Command Shared Object Symbol # ........ ........... ................. ...................... # 72.34% Joseph_ring [kernel.kallsyms] [k] 0xc11017a7 | --- 0xc150a125 | |--33.33%-- 0xc105e3a7 | 0xc105e4f6 /**********************************************************************************/