在上一篇文章中,我們使用了Perfview的分組功能。分組功能旨在對某些函數按照某個格式進行分組,以減少視圖中的各種無關函數的數量。但僅有分組還不夠,有時我們想將一些函數調用信息按某些條件過濾掉,例如將采用小於1%的函數調用信息去掉,或者將函數名中包含某個字眼的函數信息去掉,甚至只顯示某個時間段調用的函數。這就需要用到PerfView提供的過濾(Filtering)功能了。PerfVIew提供了3種過濾功能:折疊(Folding),匹配過濾,和時間范圍選擇(Set Time Range)
折疊(Folding)
PerfView在界面上提供了兩種Folding功能:“Fold%” 和 “FoldPats”.
“Fold%”意思是,將采樣少於該百分比的函數調用信息條目“折疊”掉,並將其采樣時間累加到這些函數的調用者。這里“折疊”的意思其實應該說是隱藏掉。
“FoldPats”:與“Fold%”類似,會將符合條件的函數調用記錄“折疊”(或“隱藏”)掉,而它的采樣時間將會算在它的直接調用者頭上。而與“Fold%”不同的是它的條件不是“Inc%”的值,而是函數名稱中符合給定的匹配模式。同時,這個功能也支持指定多個模式,不同模式之間用";"(分號)隔開。
過濾(Filtering)
折疊功能能實現過濾的效果,只是被過濾的項的采樣時間會被累加到調用者身上。有時我們其實只想簡單地去掉一些我們不關心的函數,同時也不需要保留它們的采樣時間。這時,我們可以采用“簡單粗暴”的過濾方式。
"IncPats":可以設置一個或多個模式(多個時用分號";"隔開),只有當函數名稱匹配一個或者多個給定的模式時,這個函數會被顯示在列表上,不匹配的會被從列表上刪除。
"ExcPats":可以設置一個或多個模式(多個時用分號";"隔開),只有當函數名稱匹配一個或者多個給定的模式時,這個函數會從列表上刪除。
因此,"IncPats"和"ExcPats"是一對反義詞,前者是“匹配則保留”,后者是“匹配則刪除”
這里說的模式,和上一篇文章中說的“通配符”是一樣的,或者可以參考幫助文件,或者在界面上對於的ToolTip提示中也有說明。
例如,以下圖例的設置中,在”IncPats“框中設置”Process% ConsoleApp7 (4108)“,起到只顯示我的程序”ConsoleApp7“的函數調用堆棧
時間范圍選擇
有時我們希望能只顯示某一段時間內的函數調用情況,Perfview也提供時間范圍選擇的功能,在界面上提供了"Start"和"End"兩個輸入框。但要注意的是,這里的時間范圍不是以絕對的時間值(比如:2018/12/27 23:15:02),而是從開始收集時經歷的毫秒數。假設你某個時間開始收集,5秒后停止,你想只看第3秒到第4秒的數據,就可以在Start中設置"3000",在End中設置"4000",Perfview只顯示大於或等於3000毫秒小於或等於4000毫秒的函數調用數據。
不僅只提供文本框輸入值的功能,Perfview還提供一個更便利的時間范圍選擇功能,如下圖:
在”When“一列中,顯示了一串文本值,一共32個,由數字字母和一些符號組成。這串由符號組成的”字符串“代表了該函數在收集過程中被采樣數(可以理解成出現的頻繁度),具體來說,Pferview將每一個函數的”Inclusive“時間分成32"段",每一段的不同符號代表了該函數的”Inclusive“時間的比例值:(以下內容是從幫助文檔中COPY的,稍作翻譯)
”_“ 代表在該段"時間段"內沒有采樣(means no samples occurred in that bucket. )
”.“代表在該段"時間段"內有0%到0.1%的Inclusive時間 (means that interval consumed between 0% and .1%. )
”o” 代表在該段"時間段"內有1% 到 1%的Inclusive時間(means that interval consumed between .1% and 1%. )
”0” 代表在該段"時間段"內有1% 到10%的Inclusive時間(means that interval consumed between 1% and 10%. )
”1” 代表在該段"時間段"內有10% 到 20%的Inclusive時間(means that interval consumed between 10% and 20% )
...
”9 代表在該段"時間段"內有90% 到100%的Inclusive時間(means that interval consumed between 90% and 100% )
”A” 代表在該段"時間段"內有100% 到110%的Inclusive時間(means that interval consumed between 100% and 110% )
...
”Z” 代表在該段"時間段"內有350% 到360%的Inclusive時間(means that interval consumed between 350% and 360% )
”*” 代表在該段"時間段"內有超過360%的Inclusive時間(means that interval consumed over 360%)
”a” 代表在該段"時間段"內有0% 到-10%的Inclusive時間(means that interval consumed between 0% and -10% )
”b” 代表在該段"時間段"內有-10% 到-20%的Inclusive時間(means that interval consumed between -10% and -20% )
...
”z” 代表在該段"時間段"內有-250% 到-260%的Inclusive時間(means that interval consumed between -250% and -260% )
”*” 代表在該段"時間段"內有超過 -260 %的Inclusive時間(means that interval consumed over -260 %) 這個我不是很清楚,不是代表360%嗎??
另外,為什么會有些值是超過100%呢? 按文檔的解釋,應該是有多個可消耗的資源單元,例如200%代表某個函數在2個CPU上都有100%的INCLUSIVE時間,但我不確定是否理解正確。
那怎么在“When”欄中進行時間范圍選擇呢?
可以雙擊“When”欄的文本值,然后用鼠標光標選擇一段或整段文本(就像平時選擇一段文字進行ctrl+c ctrl+v一樣),然后右擊並在右鍵菜單中選擇“Set Time Range”,如圖:
這樣,該時間范圍的值就會被設置到"Start"和“End”中,並進行過濾。
以上便是Perfiveiw中的幾種數據過濾功能,還是那句話,這里涉及只介紹了基本的功能,更多更具體的功能說明,可以查看幫助文檔。
系列目錄
使用PerfView監測.NET程序性能(一):Event Trace for Windows