上一篇博客中,我们了解了对Windows及应用程序进行性能分析的基础:Event Trace for Windows (ETW)。现在来看看基于ETW的性能分析工具——Perfview.exe

Perfview简介

Perfview是一个开源的CPU和内存性能分析工具,也包括一些针对.NET的分析功能,例如GC分析,JIT分析,甚至ASP.NET中的请求统计等等。Perfview是一个Windows应用程序,但也能对在Linux系统上采集的数据进行分析(参考)。Perfview免安装,而且只是一个14M的.exe文件,非常容易部署到需要进行性能分析的机器上,例如生产环境的服务器。而且在性能数据收集的过程中不需要重启应用程序或者服务器,而且收集的性能数据日志(.etl文件)可以被拷贝到其他Windows机器上,再进行分析工作,对业务的影响非常少。

Perfview已迁移到GitHub上,可以在上面下载Perfview.exe,clone库或者查看相关资料。

Perfview GitHub:https://github.com/Microsoft/perfview

Perfview视频教程:https://channel9.msdn.com/Series/PerfView-Tutorial

Vance Morrison关于Perfview的博客:https://blogs.msdn.microsoft.com/vancem/tag/perfview/

Perfview使用

在简单介绍Perfview后,我们来使用Perfview进行一个小小的性能分析,来熟悉一下Perfivew的基本操作。

这个实验使用的代码,就是Vance Morrison在视频教程中用到的Console程序。代码可以在Perfivew自带的帮助文件中找到。

  1. using System;
  2. // using System.Collections.Generic;
  3.  
  4. class Program
  5. {
  6. public static int aStatic = ;
  7. // Spin is a simple compute bound program that lasts for 5 seconds
  8. // It is a useful test program for CPU profilers.
  9. static int Main(string[] args)
  10. {
  11. int numSec = ;
  12. if (args.Length == )
  13. numSec = int.Parse(args[]);
  14.  
  15. Console.WriteLine("Spinning for {0} seconds", numSec);
  16. RecSpin(numSec);
  17. return ;
  18. }
  19.  
  20. // Spin for 'timeSec' seconds. We do only 1 second in this
  21. // method, doing the rest in the helper.
  22. static void RecSpin(int timeSec)
  23. {
  24. if (timeSec <= )
  25. return;
  26. --timeSec;
  27. SpinForASecond();
  28. RecSpinHelper(timeSec);
  29. }
  30.  
  31. // RecSpinHelper is a clone of RecSpin. It is repeated
  32. // to simulate mutual recursion (more interesting example)
  33. static void RecSpinHelper(int timeSec)
  34. {
  35. if (timeSec <= )
  36. return;
  37. --timeSec;
  38. SpinForASecond();
  39. RecSpin(timeSec);
  40. }
  41.  
  42. // SpingForASecond repeatedly calls DateTime.Now until for
  43. // 1 second. It also does some work of its own in this
  44. // methods so we get some exclusive time to look at.
  45. static void SpinForASecond()
  46. {
  47. DateTime start = DateTime.Now;
  48. for (; ; )
  49. {
  50. if ((DateTime.Now - start).TotalSeconds > )
  51. break;
  52.  
  53. // Do some work in this routine as well.
  54. for (int i = ; i < ; i++)
  55. aStatic += i;
  56. }
  57. }
  58.  
  59. }

以上代码很简单,SpinForASecond()在一秒内不断调用DateTIme.Now,而RecSpin()和RecSpinHelper()则不断地相互调用对方。这里使用循环的目的是,循环执行是一种典型的CPU密集型操作,而RecSpin()和RecSpinHelper()则是为了丰富程序的函数调用栈。

步骤一:收集程序运行数据,生成由ETW数据组成的.etl文件。

Perfview提供两种收集数据的方式,Run和Collect。“Run”是直接指定需要启动的应用程序的名称,以便启动该程序。“Collect”则是直接启动Perfview并开始收集。但不要以为"Run"方式只收集指定程序的数据。事实上无论哪种方式,Perfview都会收集系统范围内全部数据,并且收集完成后,需要选择某一个进程以进行分析。

我们以“Run”方式来收集以上代码生成的Tutorial.exe程序。

在弹出的对话框中,填入需要启动Tutorial.exe的全文件名,以及填入生成etl文件的文件名(这里是PerfViewData.etl),并点击“Run Command”:

Perfview收集和处理数据的时间比较长。在处理过程中,Perfview的右下角会闪动,并且可以查看运行日志,了解到当前Perfview在执行什么工作。

步骤二:选择需要分析的进程

在收集完毕后,在左边选择“PerfViewData.etl.zip”,并在展开的选择项中双击选择“CPU Stacks”,此时,会弹出进程选择对话框,选择需要进行CPU分析的进程。这里选择我们运行的Tutorial.exe进程。

步骤三:查看执行栈视图

在双击选择了“Tutorial.exe”的进程后,进入到程序详细的执行栈的视图中。这里记录着Tutorial.exe的函数调用树,以及函数的执行时间。

在该视图中,你可以看到Tutorial.exe的函数调用情况,包括函数调用树(Call-Tree),某个函数的调用者(Calls)和被该函数调用的函数(Callees),另外,在视图右侧,是函数的执行时间,其中,“Exc”是指 Exclusive,是指函数自己(不包含该函数里执行的子函数)的执行时间,而“Inc”是指Inclusive,指该函数及该函数中执行的子函数的总的执行时间。

另外,这个执行时间是怎么认定的呢? 答案是CPU采样。Perfview对CPU进行采样,默认每个CPU采样是1毫秒(在Prefview的高级设置中可以设置到0.125毫秒~1毫秒),每次采样中可以得到当前CPU正则执行什么代码。例如DateTime_getNow()有3250采样,则可以说明在整个程序运行中,DateTime_getNow()占用了3250毫秒的CPU时间,占整个运行时间的66.2%。通过比较各个函数的执行时间,我们就可以知道程序中哪个函数占用比较多的CPU时间。

以上便是Prefview的基本的使用步骤。Prefview提供了非常多并强大的功能,例如分组(Grouping),折叠(Folding),时间范围选择,这些在后续教程里再聊。而更强大的是,F1帮助手册里,有着非常详细的使用说明和术语解析,而且界面上几乎每个功能都有说明的ToolTip和说明的超链接如果对某个功能用法不是很清楚,可以方便地找到说明,真是业界良心。

参考资料

How many samples are enough when using a sample based profiler in a performance Investigation

The TraceEvent Library Programmers Guide

系列目录

使用PerfView监测.NET程序性能(一):Event Trace for Windows

使用PerfView监测.NET程序性能(二):Perfview的使用

使用PerfView监测.NET程序性能(三):分组

使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

使用PerfView监测.NET程序性能(二):Perfview的使用的更多相关文章

  1. 使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

    在上一篇文章中,我们使用了Perfview的分组功能.分组功能旨在对某些函数按照某个格式进行分组,以减少视图中的各种无关函数的数量.但仅有分组还不够,有时我们想将一些函数调用信息按某些条件过滤掉,例如 ...

  2. 使用PerfView监测.NET程序性能(三):分组

    在上一篇博客中,我们通过Perfview帮助文件中自带的代码来简单使用了Perfview,了解了基本操作.现在来看看Perfview中的分组操作(Grouping).分组功能都旨将记录到的各种函数调用 ...

  3. 使用PerfView监测.NET程序性能(一):Event Trace for Windows

    前言: 在日常项目开发中,我们时不时会遇到程序占用了很高CPU的情况,可能是程序里某些未经优化的代码或者Bug,或者是程序运行压力太大.无论是什么原因,我们总希望能看到到底是哪个方法占用了如此高的CP ...

  4. JVM-Java程序性能监控-初级篇

    前篇 - 小伙们都知道,java程序的性能监控主要是针对jvm中heap的监控~ 那么在做压力测试时如何对heap.线程等一系列的指标进行的监控的呢? 首先-你若不懂命令,那么就需要了解一套Java程 ...

  5. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  6. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  7. 绝对好文:.NET程序性能的基本要领

    Bill Chiles(Roslyn编译器的程序经理)写了一篇文章<Essential Performance Facts and .NET Framework Tips>,知名博主寒江独 ...

  8. .NET程序性能的基本要领

    前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做<Essential Performance Facts and .NE ...

  9. .NET程序性能优化基本要领

    想了解更多关于新的编译器的信息,可以访问     .NET Compiler Platform ("Roslyn") 基本要领 在对.NET 进行性能调优以及开发具有良好响应性的应 ...

随机推荐

  1. MSI-X 之有别于MSI

    转自: https://www.cnblogs.com/helloworldspace/p/6760718.html MSI-X Capability结构 MSI-X Capability中断机制与M ...

  2. Spring ApplicationContext(十)finishRefresh

    ApplicationContext(十)finishRefresh Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 经过 ...

  3. go语言练习

    // main package main import ( "fmt" "runtime" "sync" ) func main() { f ...

  4. php file_get_contents 使用3法

    <?php //GET function http_get($url, $params){ return file_get_contents($url.'?'.http_build_query( ...

  5. OneZero第三周第五次站立会议(2016.4.8)

    1. 时间: 15:10--15:25  共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...

  6. 网上流行的linux内核漫画

  7. 2017年多校get点

    杨辉三角形变形??? lucas定理

  8. mysql之存储引擎和文件配置

    (查看系统服务,在运行里输入services.msc) 补充:将mysql做成系统服务:mysqld --install 取消:mysqld --romove 在服务中可以直接鼠标操作mysql服务的 ...

  9. 2018.10.27 bzoj3209: 花神的数论题(数位dp)

    传送门 数位dpdpdp经典题. 题面已经暗示了我们按照二进制位来数位dpdpdp. 直接dpdpdp多少个数有111个111,222个111,333个111-, 然后快速幂算就行了. 于是我们枚举前 ...

  10. B+树和LSM比较(转)

    出处:https://blog.csdn.net/u013928917/article/details/75912045 B+树和LSM比较 在关系型数据库mysql中普遍使用B+树作为索引,在实际中 ...