内容预告:
- Windows内置工具(性能计数器)
- 事件跟踪器
- 时间分析
- 内存分配分析
- 内存使用量分析
- 其他分析
性能计数器:直接win+R运行 perfmon.exe 即可打开。可以在以下场景下使用:
- 如果发现有内存泄露,性能计数器可以被用来检查托管还是本地内存分配的问题。Process\Private Bytes可以查看所有进程分配的private内存(包括GC堆)和.NET CLR Memory\# Bytes in All Heaps可以查看托管内存。
- 如果ASP.NET程序有反常的行为,在ASP.NET目录下可以看详细信息,比如请求时间, 请求超时时间, 请求等待时间, 请求执行时间等计数器可以确认负载情况。Errors Total/Sec可以查看程序非正常的异常计数,各种cache可以查看缓存是否有效利用。
- 如果WCF中严重依赖数据库并且分布式事务处理失败的话,ServiceModelService目录可以查明问题。Calls Outstanding, Calls Per Second, and Calls Failed Per Second等计数器可以定位负载,Transactions Flowed Per Second计数器报告事务数量,SQL SERVER目录的MSSQL$INSTANCENAME:Transactions 和MSSQL$INSTANCENAME:Locks可以看出事务执行的问题,比如过多的锁,以及死锁。
自定义性能计数器的日志和警告:(笔者的电脑是win8)。步骤如下:
- 在性能计数器的左边,展开Data Collector Sets。
- 依次是User Defined -> 右键 -> new - >Data Collector Sets。
- 输入自定义的名称,,选择Create manually(Advanced)【手动创建(高级)】,NEXT
- 选择 Create Data Logs,选中Performance counter,NEXT
- 选择目录,NEXT
- 选择 Open properties for this data collector set,NEXT
- 继续配置其他信息,然后OK
- 选中刚才自定义的结点,右键-> start
- 即开始运行了,也可以右键->stop停止
- 可以通过右键Latest Report导出报告。
- 在结果窗口可以添加或删除计数器。
自定义性能计数器:你可以通过.NET的System.Diagnostics.PerformanceCounter类获取性能数据。下面是需要自定性能计数器的场景:
- 开发大型系统时,用一个基础库用来汇报性能数据,可以方便在代码级别输出性能信息。
- 开发服务器系统时,有响应客户端请求,处理请求,返回数据的功能,应该汇报请求的处理率,错误计数等类似的统计信息做为性能信息汇报出来。
- 开发高可靠性Windows服务且关联硬件时,应该汇报硬件的运行状况信息,以及和硬件间的交互等数据。
下面的代码会输出一个单实例的性能计数器数据并定时更新:
public static void CreateCategory() { if (PerformanceCounterCategory.Exists("Attendance")) { PerformanceCounterCategory.Delete("Attendance"); } CounterCreationDataCollection counters = new CounterCreationDataCollection(); CounterCreationData employeesAtWork = new CounterCreationData( "# Employees at Work", "The number of employees currently checked in.", PerformanceCounterType.NumberOfItems32); PerformanceCounterCategory.Create( "Attendance", "Attendance information for Litware, Inc.", PerformanceCounterCategoryType.SingleInstance, counters); } public static void StartUpdatingCounters() { PerformanceCounter employeesAtWork = new PerformanceCounter( "Attendance", "# Employees at Work", readOnly: false); updateTimer = new Timer(_ = > { employeesAtWork.RawValue = AttendanceSystem.Current.EmployeeCount; }, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); }
虽然性能计数器很不错,但是不能用在高性能的程序里。接下来介绍事件跟踪器。