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-frontend
或stalled-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-loads
:last level cache
讀取次數。 -
LLC-load-misses
:last 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
:三級緩存
處理器讀取數據過程如下面兩個圖:
- CPU根據虛擬地址嘗試從一級緩存(存放的是虛擬地址的索引)中讀取數據;
- 如果一級緩存中查找不到,則需向MMU請求數據;
- MMU從TLB中查找虛擬地址的緩存(換言之,
TLB
是負責改進虛擬地址到物理地址轉換速度、存放虛擬地址的緩存);- 如果TLB中存在該虛擬地址的緩存,則MMU將該虛擬地址轉化爲物理地址,如果地址轉換失敗,則發生缺頁(圖中的
fault
分支),由內核進行處理,見上文所述;如果地址轉換成功,則從二級緩存(存放的是物理地址的索引)中讀取;如果二級緩存中也沒有,則需要從三級緩存甚至物理內存中請求;- 如果TLB中不存在該虛擬地址的緩存,則MMU從物理內存中的轉換表(
translation tables
,也稱爲頁表page tables
)中獲取,同時存入TLB;(注意,這個操作是硬件實現的,可以由MMU通過硬件直接從物理內存中讀取);- 跳到第4步。
由此可見,L1-dcache-load-missed
和LLC-load-misses
的數值當然是越低越好了。另外還有dTLB-load-misses
(dTLB是數據轉換後援緩存)和iTLB-load-misses
(iTLB是指令轉換後援緩存)等指標值,具體可以用perf list
看下其他的CPU指標值:
-
List of pre-defined events (to be used in -e):
-
cpu-cycles OR cycles [Hardware event]
-
instructions [Hardware event]
-
cache-references [Hardware event]
-
cache-misses [Hardware event]
-
branch-instructions OR branches [Hardware event]
-
branch-misses [Hardware event]
-
bus-cycles [Hardware event]
-
stalled-cycles-frontend OR idle-cycles-frontend [Hardware event]
-
stalled-cycles-backend OR idle-cycles-backend [Hardware event]
-
ref-cycles [Hardware event]
-
cpu-clock [Software event]
-
task-clock [Software event]
-
page-faults OR faults [Software event]
-
context-switches OR cs [Software event]
-
cpu-migrations OR migrations [Software event]
-
minor-faults [Software event]
-
major-faults [Software event]
-
alignment-faults [Software event]
-
emulation-faults [Software event]
-
L1-dcache-loads [Hardware cache event]
-
L1-dcache-load-misses [Hardware cache event]
-
L1-dcache-stores [Hardware cache event]
-
L1-dcache-store-misses [Hardware cache event]
-
L1-dcache-prefetches [Hardware cache event]
-
L1-dcache-prefetch-misses [Hardware cache event]
-
L1-icache-loads [Hardware cache event]
-
L1-icache-load-misses [Hardware cache event]
-
L1-icache-prefetches [Hardware cache event]
-
L1-icache-prefetch-misses [Hardware cache event]
-
LLC-loads [Hardware cache event]
-
LLC-load-misses [Hardware cache event]
-
LLC-stores [Hardware cache event]
-
LLC-store-misses [Hardware cache event]
-
LLC-prefetches [Hardware cache event]
-
LLC-prefetch-misses [Hardware cache event]
-
dTLB-loads [Hardware cache event]
-
dTLB-load-misses [Hardware cache event]
-
dTLB-stores [Hardware cache event]
-
dTLB-store-misses [Hardware cache event]
-
dTLB-prefetches [Hardware cache event]
-
dTLB-prefetch-misses [Hardware cache event]
-
iTLB-loads [Hardware cache event]
-
iTLB-load-misses [Hardware cache event]
-
branch-loads [Hardware cache event]
-
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