Linux perf命令詳解及常用參數解析


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM