perf stat 輸出解讀

原文鏈接:https://blog.csdn.net/u011630575/article/details/66476165

perf stat 輸出解讀

原文鏈接:http://zhengheng.me/2015/11/12/perf-stat/

 

  • task-clock:用於執行程序的CPU時間,單位是ms(毫秒)。第二列中的CPU utillized則是指這個進程在運行perf的這段時間內的CPU利用率,該數值是由task-clock除以最後一行的time elapsed(也就是wall time,真實時間,單位爲秒,下面的M/sec等數值都是除以這個數得到的)再除以1000得出的。

  • context-switches:程序在運行過程中發生的上下文切換次數。這個指標值大家都很熟悉,就不細說了。

  • cpu-migrations:程序在運行過程中發生的CPU遷移次數,即被調度器從一個CPU轉移到另外一個CPU上運行。

    這裏要注意下CPU遷移和上下文切換的不同之處:發生上下文切換時不一定會發生CPU遷移,而發生CPU遷移時肯定會發生上下文切換。發生上下文切換時有可能只是把上下文從當前CPU中換出,下一次調度器還是將進程安排在這個CPU上執行。

  • page-faults:缺頁。指當內存訪問時先根據進程虛擬地址空間中的虛擬地址通過MMU查找該內存頁在物理內存的映射,沒有找到該映射,則發生缺頁,然後通過CPU中斷調用處理函數,從物理內存中讀取。見下圖所示的例子(MMU,Memory Management Unit,是CPU中負責將負責虛擬地址映射爲物理地址的單元):

  • cycles:CPU時鐘週期。CPU從它的指令集(instruction set)中選擇指令執行。一個指令包含以下的步驟,每個步驟由CPU的一個叫做功能單元(functional unit)的組件來進行處理,每個步驟的執行都至少需要花費一個時鐘週期。

  • 指令讀取(instruction fetch)
  • 指令解碼(instruction decode)
  • 執行(execute)
  • 內存訪問(memory access)
  • 寄存器回寫(register write-back)

    第二列中的1.023G Hz這個值不是固定的,猜測(需要再查下資料)可能是在這段時間內的時鐘頻率(CPU時鐘頻率也可以由內核發起請求修改,或者由處理器自己動態調整。如內核空閒線程(kernel idle thread)可以請求CPU降低頻率來節省能源)。

  • stalled-cycles:字面意義是停滯週期,先介紹下instruction pipeline(姑且翻譯爲指令管道):指令管道是一種可以並行執行多個指令的CPU架構,通過同時執行不同的指令的不同組合實現。這類似於工廠的組裝線,產品的不同階段可以並行執行以提高吞吐量。考慮前面提到的指令步驟,如果每個步驟需要一個時鐘週期,該指令則需要五個時鐘週期來完成執行。在這個指令的每個單獨的步驟中,只有一個功能單元是運行的,而其他四個是空閒的。通過使用指令管道,多個功能單元可以在同一時間運行,在管道中處理不同的指令。在理想狀態下,處理器可以在一個時鐘週期中完成一個指令。而stalled-cycles,則是指令管道未能按理想狀態發揮並行作用,發生停滯的時鐘週期。stalled-cycles-frontend指指令讀取或解碼的指令步驟,而stalled-cycles-backend則是指令執行步驟。第二列中的cycles idle其實意思跟stalled是一樣的,由於指令執行停滯了,所以指令管道也就空閒了,千萬不要誤解爲CPU的空閒率。這個數值是由stalled-cycles-frontendstalled-cycles-backend除以上面的cycles得出的。

  • instructions:該進程在這段時間內完成的CPU指令,之前在cycles已介紹過了。這是整個perf stat命令輸出中最重要的指標值。第二列中的insns per cycle,簡稱IPC,表示一個時鐘週期內能完成多少個CPU指令。該值越高,表示CPU的性能越好。第二行的stalled cycles per insn,表示完成每個指令,有多少個時鐘週期是被停滯的,這個值越小,表示CPU的性能越好。該值是由stalled-cycles-frontend除以instructions得到的。

    爲何不用stalled-cycles-backend來除,或兩個stalled-cycles加起來再除,個人估計是stalled-cycles-frontend停滯了,肯定stalled-cycles-backend也會停滯,因此可預見前者的值肯定會比後者要大(跑了幾次驗證確實如此),因此後者是受前者影響的,用前者來除比較靠譜。

  • branches:這段時間內發生分支預測的次數。現代的CPU都有分支預測方面的優化。分支預測有什麼好處請見stackoverflow上的這個帖子

  • branches-misses:這段時間內分支預測失敗的次數,這個值越小越好。

  • L1-dcache-loads:一級數據緩存讀取次數。

  • L1-dcache-load-missed:一級數據緩存讀取失敗次數。

  • LLC-loadslast level cache讀取次數。

  • LLC-load-misseslast level cache讀取失敗次數。

要理解CPU緩存是什麼,需要先了解下CPU的緩存架構,如下圖:1. level-1 data cache:一級數據緩存(I$
2. level-1 inst cache:一級指令緩存(D$
3. MMU內存管理單元 
4. TLB:轉換後援緩存(translation lookaside buffer
5. level-2 cache:二級緩存(E$
6. level-3 cache:三級緩存 
處理器讀取數據過程如下面兩個圖:

  1. CPU根據虛擬地址嘗試從一級緩存(存放的是虛擬地址的索引)中讀取數據;
  2. 如果一級緩存中查找不到,則需向MMU請求數據;
  3. MMU從TLB中查找虛擬地址的緩存(換言之,TLB是負責改進虛擬地址到物理地址轉換速度、存放虛擬地址的緩存);
  4. 如果TLB中存在該虛擬地址的緩存,則MMU將該虛擬地址轉化爲物理地址,如果地址轉換失敗,則發生缺頁(圖中的fault分支),由內核進行處理,見上文所述;如果地址轉換成功,則從二級緩存(存放的是物理地址的索引)中讀取;如果二級緩存中也沒有,則需要從三級緩存甚至物理內存中請求;
  5. 如果TLB中不存在該虛擬地址的緩存,則MMU從物理內存中的轉換表(translation tables,也稱爲頁表page tables)中獲取,同時存入TLB;(注意,這個操作是硬件實現的,可以由MMU通過硬件直接從物理內存中讀取);
  6. 跳到第4步。

由此可見,L1-dcache-load-missedLLC-load-misses的數值當然是越低越好了。另外還有dTLB-load-misses(dTLB是數據轉換後援緩存)和iTLB-load-misses(iTLB是指令轉換後援緩存)等指標值,具體可以用perf list看下其他的CPU指標值:


 
  1. List of pre-defined events (to be used in -e):

  2. cpu-cycles OR cycles [Hardware event]

  3. instructions [Hardware event]

  4. cache-references [Hardware event]

  5. cache-misses [Hardware event]

  6. branch-instructions OR branches [Hardware event]

  7. branch-misses [Hardware event]

  8. bus-cycles [Hardware event]

  9. stalled-cycles-frontend OR idle-cycles-frontend [Hardware event]

  10. stalled-cycles-backend OR idle-cycles-backend [Hardware event]

  11. ref-cycles [Hardware event]

  12.  
  13. cpu-clock [Software event]

  14. task-clock [Software event]

  15. page-faults OR faults [Software event]

  16. context-switches OR cs [Software event]

  17. cpu-migrations OR migrations [Software event]

  18. minor-faults [Software event]

  19. major-faults [Software event]

  20. alignment-faults [Software event]

  21. emulation-faults [Software event]

  22.  
  23. L1-dcache-loads [Hardware cache event]

  24. L1-dcache-load-misses [Hardware cache event]

  25. L1-dcache-stores [Hardware cache event]

  26. L1-dcache-store-misses [Hardware cache event]

  27. L1-dcache-prefetches [Hardware cache event]

  28. L1-dcache-prefetch-misses [Hardware cache event]

  29. L1-icache-loads [Hardware cache event]

  30. L1-icache-load-misses [Hardware cache event]

  31. L1-icache-prefetches [Hardware cache event]

  32. L1-icache-prefetch-misses [Hardware cache event]

  33. LLC-loads [Hardware cache event]

  34. LLC-load-misses [Hardware cache event]

  35. LLC-stores [Hardware cache event]

  36. LLC-store-misses [Hardware cache event]

  37. LLC-prefetches [Hardware cache event]

  38. LLC-prefetch-misses [Hardware cache event]

  39. dTLB-loads [Hardware cache event]

  40. dTLB-load-misses [Hardware cache event]

  41. dTLB-stores [Hardware cache event]

  42. dTLB-store-misses [Hardware cache event]

  43. dTLB-prefetches [Hardware cache event]

  44. dTLB-prefetch-misses [Hardware cache event]

  45. iTLB-loads [Hardware cache event]

  46. iTLB-load-misses [Hardware cache event]

  47. branch-loads [Hardware cache event]

  48. branch-load-misses [Hardware cache event]

-e選項指定相應的指標值,如:

perf stat -e cycles,instructions,L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses,dTLB-loads,dTLB-load-misses -p 316 sleep 10  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章