perf
相關命令:暫無相關命令
perf是Linux下的一款性能分析工具,能夠進行函數級與指令級的熱點查找。
Perf List
利用perf剖析程序性能時,需要指定當前測試的性能時間。性能事件是指在處理器或操作系統中發生的,可能影響到程序性能的硬件事件或軟件事件
Perf top
實時顯示系統/進程的性能統計信息
常用參數
-e:指定性能事件
-a:顯示在所有CPU上的性能統計信息
-C:顯示在指定CPU上的性能統計信息
-p:指定進程PID
-t:指定線程TID
-K:隱藏內核統計信息
-U:隱藏用戶空間的統計信息
-s:指定待解析的符號信息
‘‐G’ or‘‐‐call‐graph’ <output_type,min_percent,call_order>
graph: 使用調用樹,將每條調用路徑進一步折疊。這種顯示方式更加直觀。
每條調用路徑的采樣率為絕對值。也就是該條路徑占整個采樣域的比率。
fractal
默認選項。類似與 graph,但是每條路徑前的采樣率為相對值。
flat
不折疊各條調用
選項 call_order 用以設定調用圖譜的顯示順序,該選項有 2個取值,分別是
callee 與caller。
將該選項設為callee 時,perf按照被調用的順序顯示調用圖譜,上層函數被下層函數所調用。
該選項被設為caller 時,按照調用順序顯示調用圖譜,即上層函數調用了下層函數路徑,也不顯示每條調用路徑的采樣率
注: Perf top需要root權限
Perf stat
分析系統/進程的整體性能概況
task‐clock事件表示目標任務真正占用處理器的時間,單位是毫秒。也稱任務執行時間
context-switches是系統發生上下文切換的次數
CPU-migrations是任務從一個處理器遷往另外一個處理器的次數
page-faults是內核發生缺頁的次數
cycles是程序消耗的處理器周期數
instructions是指命令執行期間產生的處理器指令數
branches是指程序在執行期間遇到的分支指令數。
branch‐misses是預測錯誤的分支指令數。
XXX seconds time elapsed系程序持續時間
任務執行時間/任務持續時間大於1,那可以肯定是多核引起的
參數設置:
-e:選擇性能事件
-i:禁止子任務繼承父任務的性能計數器。
-r:重復執行 n 次目標程序,並給出性能指標在n 次執行中的變化范圍。
-n:僅輸出目標程序的執行時間,而不開啟任何性能計數器。
-a:指定全部cpu
-C:指定某個cpu
-A:將給出每個處理器上相應的信息。
-p:指定待分析的進程id
-t:指定待分析的線程id
Perf record
記錄一段時間內系統/進程的性能時間
參數:
-e:選擇性能事件
-p:待分析進程的id
-t:待分析線程的id
-a:分析整個系統的性能
-C:只采集指定CPU數據
-c:事件的采樣周期
-o:指定輸出文件,默認為perf.data
-A:以append的方式寫輸出文件
-f:以OverWrite的方式寫輸出文件
-g:記錄函數間的調用關系
Perf Report
讀取perf record生成的數據文件,並顯示分析數據
參數
-i:輸入的數據文件
-v:顯示每個符號的地址
-d <dos>:只顯示指定dos的符號
-C:只顯示指定comm的信息(Comm. 觸發事件的進程名)
-S:只考慮指定符號
-U:只顯示已解析的符號
-g[type,min,order]:顯示調用關系,具體等同於perf top命令中的-g
-c:只顯示指定cpu采樣信息
-M:以指定匯編指令風格顯示
–source:以匯編和source的形式進行顯示
-p<regex>:用指定正則表達式過濾調用函數
# perf top -e cycles:k #顯示內核和模塊中,消耗最多CPU周期的函數 # perf top -e kmem:kmem_cache_alloc #顯示分配高速緩存最多的函數 # perf top Samples: 1M of event 'cycles', Event count (approx.): 73891391490 5.44% perf [.] 0x0000000000023256 4.86% [kernel] [k] _spin_lock 2.43% [kernel] [k] _spin_lock_bh 2.29% [kernel] [k] _spin_lock_irqsave 1.77% [kernel] [k] __d_lookup 1.55% libc-2.12.so [.] __strcmp_sse42 1.43% nginx [.] ngx_vslprintf 1.37% [kernel] [k] tcp_poll 第一列:符號引發的性能事件的比例,默認指占用的cpu周期比例。 第二列:符號所在的DSO(Dynamic Shared Object),可以是應用程序、內核、動態鏈接庫、模塊。 第三列:DSO的類型。[.]表示此符號屬於用戶態的ELF文件,包括可執行文件與動態鏈接庫)。[k]表述此符號屬於內核或模塊。 第四列:符號名。有些符號不能解析為函數名,只能用地址表示。
# perf top -G #得到調用關系圖
# perf top -e cycles #指定性能事件 # perf top -p 23015,32476 #查看這兩個進程的cpu cycles使用情況 # perf top -s comm,pid,symbol #顯示調用symbol的進程名和進程號 # perf top --comms nginx,top #僅顯示屬於指定進程的符號 # perf top --symbols kfree #僅顯示指定的符號
# perf stat ls Performance counter stats for 'ls': 0.653782 task-clock # 0.691 CPUs utilized 0 context-switches # 0.000 K/sec 0 CPU-migrations # 0.000 K/sec 247 page-faults # 0.378 M/sec 1,625,426 cycles # 2.486 GHz 1,050,293 stalled-cycles-frontend # 64.62% frontend cycles idle 838,781 stalled-cycles-backend # 51.60% backend cycles idle 1,055,735 instructions # 0.65 insns per cycle # 0.99 stalled cycles per insn 210,587 branches # 322.106 M/sec 10,809 branch-misses # 5.13% of all branches 0.000945883 seconds time elapsed 輸出包括ls的執行時間,以及10個性能事件的統計。 task-clock:任務真正占用的處理器時間,單位為ms。CPUs utilized = task-clock / time elapsed,CPU的占用率。 context-switches:上下文的切換次數。 CPU-migrations:處理器遷移次數。Linux為了維持多個處理器的負載均衡,在特定條件下會將某個任務從一個CPU 遷移到另一個CPU。 page-faults:缺頁異常的次數。當應用程序請求的頁面尚未建立、請求的頁面不在內存中,或者請求的頁面雖然在內 存中,但物理地址和虛擬地址的映射關系尚未建立時,都會觸發一次缺頁異常。另外TLB不命中,頁面訪問權限不匹配 等情況也會觸發缺頁異常。 cycles:消耗的處理器周期數。如果把被ls使用的cpu cycles看成是一個處理器的,那么它的主頻為2.486GHz。 可以用cycles / task-clock算出。 stalled-cycles-frontend:略過。 stalled-cycles-backend:略過。 instructions:執行了多少條指令。IPC為平均每個cpu cycle執行了多少條指令。 branches:遇到的分支指令數。branch-misses是預測錯誤的分支指令數。 # perf stat -r 10 ls > /dev/null #執行10次程序,給出標准偏差與期望的比值 # perf stat -v ls > /dev/null #顯示更詳細的信息 # perf stat -n ls > /dev/null #只顯示任務執行時間,不顯示性能計數器 # perf stat -a -A ls > /dev/null #單獨給出每個CPU上的信息 # perf stat -e syscalls:sys_enter ls #ls命令執行了多少次系統調用
# perf record -p `pgrep -d ',' nginx` #記錄nginx進程的性能數據
# perf record ls -g #記錄執行ls時的性能數據 # perf record -e syscalls:sys_enter ls #記錄執行ls時的系統調用,可以知道哪些系統調用最頻繁
# perf lock record ls #記錄
# perf lock report #報告 Name acquired contended total wait (ns) max wait (ns) min wait (ns) &mm->page_table_... 382 0 0 0 0 &mm->page_table_... 72 0 0 0 0 &fs->lock 64 0 0 0 0 dcache_lock 62 0 0 0 0 vfsmount_lock 43 0 0 0 0 &newf->file_lock... 41 0 0 0 0 Name:內核鎖的名字。 aquired:該鎖被直接獲得的次數,因為沒有其它內核路徑占用該鎖,此時不用等待。 contended:該鎖等待后獲得的次數,此時被其它內核路徑占用,需要等待。 total wait:為了獲得該鎖,總共的等待時間。 max wait:為了獲得該鎖,最大的等待時間。 min wait:為了獲得該鎖,最小的等待時間。
# perf kmem record ls #記錄
# perf kmem stat --caller --alloc -l 20 #報告 ------------------------------------------------------------------------------------------------------ Callsite | Total_alloc/Per | Total_req/Per | Hit | Ping-pong | Frag ------------------------------------------------------------------------------------------------------ perf_event_mmap+ec | 311296/8192 | 155952/4104 | 38 | 0 | 49.902% proc_reg_open+41 | 64/64 | 40/40 | 1 | 0 | 37.500% __kmalloc_node+4d | 1024/1024 | 664/664 | 1 | 0 | 35.156% ext3_readdir+5bd | 64/64 | 48/48 | 1 | 0 | 25.000% load_elf_binary+8ec | 512/512 | 392/392 | 1 | 0 | 23.438% Callsite:內核代碼中調用kmalloc和kfree的地方。 Total_alloc/Per:總共分配的內存大小,平均每次分配的內存大小。 Total_req/Per:總共請求的內存大小,平均每次請求的內存大小。 Hit:調用的次數。 Ping-pong:kmalloc和kfree不被同一個CPU執行時的次數,這會導致cache效率降低。 Frag:碎片所占的百分比,碎片 = 分配的內存 - 請求的內存,這部分是浪費的。 有使用--alloc選項,還會看到Alloc Ptr,即所分配內存的地址。
# perf sched record sleep 10
# perf report latency --sort max --------------------------------------------------------------------------------------------------------------- Task | Runtime ms | Switches | Average delay ms | Maximum delay ms | Maximum delay at | --------------------------------------------------------------------------------------------------------------- events/10:61 | 0.655 ms | 10 | avg: 0.045 ms | max: 0.161 ms | max at: 9804.958730 s sleep:11156 | 2.263 ms | 4 | avg: 0.052 ms | max: 0.118 ms | max at: 9804.865552 s edac-poller:1125 | 0.598 ms | 10 | avg: 0.042 ms | max: 0.113 ms | max at: 9804.958698 s events/2:53 | 0.676 ms | 10 | avg: 0.037 ms | max: 0.102 ms | max at: 9814.751605 s perf:11155 | 2.109 ms | 1 | avg: 0.068 ms | max: 0.068 ms | max at: 9814.867918 s TASK:進程名和pid。 Runtime:實際的運行時間。 Switches:進程切換的次數。 Average delay:平均的調度延遲。 Maximum delay:最大的調度延遲。 Maximum delay at:最大調度延遲發生的時刻。
# perf probe --line schedule #前面有行號的可以探測,沒有行號的就不行了 # perf report latency --sort max #在schedule函數的12處增加一個探測點
參考資料:http://linux.51yip.com/search/perf