perf ,比較好的一個程序性能測試工具

面對一個問題程序,最好採用自頂向下的策略。先總體看看該程序運行時各類統計事件的大概,再針對某些方向深刻細節。而不要一會兒扎進瑣碎細節,會一葉障目的。frontend

對於優化本身寫的代碼,cpu bound 型 和 IO bound 型是不同的:函數

  • cpu bound 型:所謂cpu bound型指的是程序大部分時間都在使用CPU。
  • IO bound 型:由cpu bound型的定義就不難推出了。

perf stat 命令用於統計進程整體的信息

/*******************************************************************************/
    $ 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 命令可查看系統的實時信息

例如系統中最耗時的內核函數或某個用戶進程:

/*******************************************************************************/
    $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
    
    
    /**********************************************************************************/
相關文章
相關標籤/搜索