博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET 性能测试工具 -- 性能计数器

Posted on 2012-12-09 22:02  淡如水wp  阅读(1884)  评论(0编辑  收藏  举报

内容预告:

  • 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)。步骤如下:

  1. 在性能计数器的左边,展开Data Collector Sets。
  2. 依次是User Defined -> 右键 -> new - >Data Collector Sets。
  3. 输入自定义的名称,,选择Create manually(Advanced)【手动创建(高级)】,NEXT
  4. 选择 Create Data Logs,选中Performance counter,NEXT
  5. 选择目录,NEXT
  6. 选择 Open properties for this data collector set,NEXT
  7. 继续配置其他信息,然后OK
  8. 选中刚才自定义的结点,右键-> start
  9. 即开始运行了,也可以右键->stop停止
  10. 可以通过右键Latest Report导出报告。
  11. 在结果窗口可以添加或删除计数器。

自定义性能计数器:你可以通过.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));
}

虽然性能计数器很不错,但是不能用在高性能的程序里。接下来介绍事件跟踪器。