在上一篇文章使用PerfView监测.NET程序性能(三):分组中,我们使用了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中的几种数据过滤功能,还是那句话,这里涉及只介绍了基本的功能,更多更具体的功能说明,可以查看帮助文档。
原文地址: https://www.cnblogs.com/lwhkdash/p/10146947.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com