比如我们有这样一个需求:
我要编码方式记录我们当前编写的程序每秒钟抛出异常数
如果我们直接使用 Performance 工具,就是采用下图方式依次选择:
1、选择要做性能测试的计算机
2、选择要用那个 Proformance object; 这里我们选择: .NET CLR Exceptions
3、选择 需要的计数项,这里我们选 # of Exceps Thrown / sec
4、选择你要对那个程序进行测试(也就是那个进程产生的异常),在这里就请选择你要测试的程序名字
如果我们希望用编码方式来实现这个功能的话,也很简单:
System.Diagnostics.PerformanceCounter 就是编码获得性能计数的核心
这部分的代码如下:
System.Diagnostics.PerformanceCounter pc = new PerformanceCounter();
// 获取或设置此性能计数器的性能计数器类别的名称。
pc.CategoryName = ".NET CLR Exceptions";
// 获取或设置与此 PerformanceCounter 实例关联的性能计数器的名称。
pc.CounterName = "# of Exceps Thrown / sec";
// 获取或设置此性能计数器的实例名称。
pc.InstanceName =
System.IO.Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.SetupInformation.ApplicationName);
pc.ReadOnly = true;
Console.WriteLine(pc.RawValue);
Console.WriteLine(pc.NextValue());
int num = 30;
for (int i = 0; i < num; i++)
{
try
{
throw new Exception("test Exception");
}
catch (Exception)
{
}
}
// 获取或设置此计数器的原始值(即未经过计算的值)。
Console.WriteLine(pc.RawValue);
// 获取计数器样本并为其返回计算所得值。
Console.WriteLine(pc.NextValue());
Console.WriteLine("===========");
上述代码只是一个超简单的例子,实际性能计数可以写得比这个更复杂。
这时候,你可以参考以下几个类:
类 |
说明 |
System.Diagnostics.PerformanceCounter
|
表示 Windows NT 性能计数器组件。使用该类读取现有预定义的或自定义的计数器并向自定义计数器发布(写入)性能数据。
|
System.Diagnostics.PerformanceCounterCategory
|
提供与计数器交互的几种方法以及该计算机上计数器的类别。
|
System.Diagnostics.PerformanceCounterInstaller
|
指定 PerformanceCounter 组件的安装程序。
|
System.Diagnostics.PerformanceCounterType
|
指定用于计算 PerformanceCounter 的 NextValue 方法的公式。
|
附:
我们这个例子中需要做的性能计数器:
# of Exceps Thrown / Sec(引发的异常数/秒)
显示每秒引发的异常的数目。它包括 .NET 异常和转换成 .NET 异常的非托管异常。例如,从非托管代码返回的 HRESULT 转换为托管代码中的异常。
此计数器包括已处理和未处理的异常。此计数器不是一段时间内的平均值;它显示在最后两个样本(以取样间隔持续时间来划分)中观察到的值之间的差异。此计数器是一个潜在性能问题(如果引发多于 100 个的较多数目的异常)的指示器。
相关文章
- 博客堂
博客不在多,有激情就行;内容不在深,无堆砌转载就灵。斯,是博客堂,唯技术先行。架构满篇飞,代码 ... 通过编码方式使用性能计数器来进行性能计数的一个简单例子
索引时间: 2008-10-18T12:42:37Z
- 托管异常的性能 - 蝈蝈俊.net - 博客堂
博客堂 个人首页 联系 ... Combine (合并两个路径字符串)方法的一些使用细节 | 个人首页 | 通过编码方式使用性能计数器来进行性能计数的一个简单例子 ... 1 我们先来看看下面代码的执行效果: 下述代码中,依次扔出指定 ...
索引时间: 2008-12-25T21:44:44Z
- 博客堂
博客堂 开心编码 ... 通过我们一些已有的自定义字段类型,来完成一些特定的功能,最后给出一个由自定义字段类型拼装完整应用的例子。 先来看几个简单 ... 通过另外一个列表来实现,可以直接进入这个列表新建列表条目,然而更直接也更友好的方式,就是直接在场地列表中对“心仪”的场地进行 ...
索引时间: 2008-12-26T20:31:58Z
- 蝈蝈俊.net - 2006-08 Entries
博客堂 个人首页 联系 ... 通过编码方式使用性能计数器来进行性能计数的一个简单例子 摘要: 比如我们有这样一个需求: 我要编码方式记录我们 ...
索引时间: 2008-11-30T15:40:41Z
更详细的请参考 IIS 帮助文档
ASP.NET 的性能计数器
ASP.NET 支持两组性能计数器:系统和应用程序。前者在 ASP.NET 性能计数器对象中的 PerfMon 中公开;后者在 ASP.NET Applications 性能对象中公开。ASP.NET 性能对象中的 State Server Sessions 计数器(仅适用于在其中运行状态服务器的服务器计算机)和 ASP.NET Applications 性能对象中的 Sessions 计数器(仅适用于进程中发生的用户会话)之间存在很大的差异。
注意 每 400 毫秒更新一次与每个性能计数器关联的值。
在监视 ASP.NET Web 应用程序的性能时,应该始终跟踪下表中列出的性能计数器。
性能对象 |
性能计数器 |
ASP.NET |
Application Restarts |
ASP.NET |
Requests Queued |
ASP.NET |
Worker Process Restarts |
ASP.NET Applications |
Errors Total |
ASP.NET Applications |
Requests/Sec |
Processor |
% CPU Utilization |
% CPU Utilization 计数器监视 Web 服务器计算机上的 CPU 使用情况。无论客户端负载如何,CPU 使用率很低或者无法达到 CPU 最大使用率就意味着 Web 应用程序中存在资源或锁定竞争。
此外,在确定 Web 应用程序性能问题时,下表中列出的性能计数器是非常有用的。
性能对象 |
性能计数器 |
ASP.NET Applications |
Pipeline Instance Count |
.NET CLR Exceptions |
# of Exceps Thrown |
System |
Context Switches/sec |
# of Exceps Thrown 计数器显示应用程序中引发的异常数量,因为它们可能会对性能造成不利影响。但是,某些代码路径必须依赖异常才能正常工作。例如,HttpResponse.Redirect 方法始终引发一个无法捕获的异常 ThreadAbortException。因此,使用 Errors Total 计数器跟踪引发的异常数量以查看异常是否在应用程序上生成错误更有用处。
Context Switches/sec 计数器测量 Web 服务器计算机中所有 CPU 切换线程上下文的速率。如果此计数器的数值较大,则表明锁定竞争很激烈,或者线程在用户和内核模式之间频繁切换。可能还需要使用采样分析器和其他工具进行进一步的分析。
以下列表详细介绍了 ASP.NET 和 ASP.NET Applications 性能对象中的计数器。
ASP.NET 系统性能计数器
ASP.NET 支持以下 ASP.NET 系统性能计数器。它们汇集 Web 服务器计算机上所有 ASP.NET 应用程序的信息,或者它们通常应用于运行相同应用程序的 ASP.NET 服务器的系统。它们可能包含 Web 场和 Web 园。
- Application Restarts
- 在 Web 服务器的生存期内应用程序已重新启动的次数。每发生一次 Application_OnEnd 事件,应用程序重新启动次数就会增加一次。可能由于以下原因而出现应用程序重新启动:更改 Web.config 文件,更改应用程序 \Bin 目录中存储的程序集,或者对 Web 表单页更改过多。此计数器意外增加可能意味着,未知问题将导致 Web 应用程序关闭。在此类情况下,应该尽早调查原因。
注意 每次重新启动 Internet 信息服务 (IIS) 主机时,就会重置该值。
- Application Running
- 服务器计算机上运行的应用程序的数量。
- Requests Disconnected
- 由于通讯故障而断开的请求数量。
- Requests Queued
- 在队列中等待服务的请求数。当此数值随客户端负载线性增加时,则 Web 服务器计算机已达到它所能处理的并发请求的上限。此计数器的默认最大值为 5,000。可以在计算机的 Machine.config 文件中更改此设置。
- Requests Rejected
- 由于处理请求的服务器资源不足而未执行的请求总数。此计数器表示返回 503 HTTP 状态代码(表示服务器太忙)的请求数量。
- Request Wait Time
- 队列中的最近请求等待处理的亳秒数。
- Session State Server Connections Total
- 存储进程外会话状态数据的计算机的会话状态连接总数。
- Session SQL Server Connections Total
- 存储会话状态数据的 Microsoft SQL Server™ 数据库的会话状态连接总数。
- State Server Sessions Abandoned
- 已明确放弃的用户会话数。它们是由特定用户操作结束的会话,如关闭浏览器或浏览到另一个站点。该计数器只用于运行状态服务器服务 (aspnet_state) 的计算机上。
- State Server Sessions Active
- 当前活动用户会话的数量。该计数器只用于运行状态服务器服务 (aspnet_state) 的计算机上。
- State Server Sessions Timed Out
- 由于用户非活动而处于非活跃状态的用户会话数。该计数器只用于运行状态服务器服务 (aspnet_state) 的计算机上。
- State Server Sessions Total
- 在进程生存期内创建的会话数。此计数器是 State Server Sessions Active、State Server Sessions Abandoned 和 State Server Sessions Timed Out 的累积值。该计数器只用于运行状态服务器服务 (aspnet_state) 的计算机上。
- Worker Process Restarts
- 在服务器计算机上已重新启动工作进程的次数。如果工作进程意外失败或者有意回收,则可以重新启动该工作进程。当此计数器出现意外增加时,应该尽早调查原因。
- Worker Process Running
- 服务器计算机上运行的工作进程的数量。
ASP.NET Application 性能计数器
ASP.NET 支持以下应用程序性能计数器,可以使用这些计数器来监视单个 ASP.NET 应用程序实例的性能。这些计数器均有一个唯一实例 __Total__,该实例合计 Web 服务器上所有应用程序的计数器(与本主题第一节中描述的全局计数器类似)。__Total__ 实例始终可用。当服务器上没有应用程序时,这些计数器将显示零。
- Anonymous Requests
- 使用匿名身份验证的请求数。
- Anonymous Requests/Sec
- 每秒使用匿名身份验证的请求数。
- Cache Total Entries
- 缓存中的总项数。该计数器既包括由 ASP.NET 页框架在内部使用的缓存,又包括通过公开的 API 在外部使用的缓存。
- Cache Total Hits
- 缓存的命中总数。该计数器既包括由 ASP.NET 页框架在内部使用的缓存,又包括通过公开的 API 在外部使用的缓存。
- Cache Total Misses
- 每个应用程序失败的缓存请求数。该计数器既包括由 ASP.NET 在内部使用的缓存,又包括通过公开的 API 在外部使用的缓存。
- Cache Total Hit Ratio
- 缓存的命中与未命中的比率。该计数器既包括由 ASP.NET 在内部使用的缓存,又包括通过公开的 API 在外部使用的缓存。
- Cache Total Turnover Rate
- 每秒对总缓存的添加数和移除数。这对确定缓存的使用效率很有帮助。如果反复很大,则无法有效地使用缓存。
- Cache API Entries
- 应用程序缓存中的总项数。
- Cache API Hits
- 当只通过外部缓存 API 访问缓存时,缓存中的命中总数。该计数器不跟踪由 ASP.NET 在内部使用的缓存。
- Cache API Misses
- 在通过外部缓存 API 访问时,失败的缓存请求的总数。该计数器不跟踪由 ASP.NET 在内部使用的缓存。
- Cache API Hit Ratio
- 在通过外部缓存 API 访问时,缓存命中与未命中的比率。该计数器不跟踪由 ASP.NET 在内部使用的缓存。
- Cache API Turnover Rate
- 在通过外部 API 使用(不包括 ASP.NET 页框架在内部使用的缓存)时,缓存每秒增加或减少的数量。这对确定缓存的使用效率很有帮助。如果反复很大,则无法有效地使用缓存。
- Compilations Total
- 在当前 Web 服务器进程的生存期内发生的编译总数。当在服务器上动态编译扩展名为 .aspx、.asmx、.ascx 或 .ashx 的文件或代码隐藏源文件时,就会发生这种情况。
注意 在对应用程序的所有部分提出请求时,此数值开始逐步达到峰值。但是,在进行编译时,将产生的二进制数据保存到磁盘(在其中重新使用该数据,直到其源文件发生变化时为止)中。这意味着,即使进程重新启动,计数器仍可保持为零(非活跃),直到修改或重新部署应用程序时为止。
- Debugging Requests
- 在启用调试时发生的请求数。
- Errors During Preprocessing
- 在分析期间发生的错误数。不包括编译和运行时错误。
- Errors During Compilation
- 在动态编译期间发生的错误数。不包括分析程序和运行时错误。
- Errors During Execution
- 在执行 HTTP 请求期间发生的错误总数。不包括分析程序和编译错误。
- Errors Unhandled During Execution
- 在执行 HTTP 请求期间发生的未处理错误的总数。
注意 未处理的错误是指任何未捕获的运行时异常,它转换页面上的用户代码并输入 ASP.NET 内部错误处理逻辑。在以下情况下,此规则出现例外情况:
- 启用了自定义错误和/或定义了错误页面。
- 在用户代码中定义了 Page_Error 事件并且清除了该错误(使用 HttpServerUtility.ClearError 方法)或执行重定向。
- Errors Unhandled During Execution/Sec
- 在执行 HTTP 请求期间每秒发生的未处理异常的数量。
- Errors Total
- 在执行 HTTP 请求期间发生的错误的总数。包括任何分析程序、编译或运行时错误。此计数器是 Errors During Compilation、Errors During Preprocessing 和 Errors During Execution 计数器的总和。正常工作的 Web 服务器不应生成错误。如果在 ASP.NET Web 应用程序中发生错误,则它们可能会由于错误恢复的代码路径不同而歪曲吞吐量结果。在执行调试之前,调查并修复应用程序中的任何错误。
- Errors Total/Sec
- 在执行 HTTP 请求期间每秒发生的错误数。包括任何分析程序、编译或运行时错误。
- Output Cache Entries
- 输出缓存中的总项数。
- Output Cache Hits
- 从输出缓存中处理的请求总数。
- Output Cache Misses
- 每个应用程序失败的输出缓存请求数。
- Output Cache Hit Ratio
- 从输出缓存中处理的全部请求所占的百分比。
- Output Cache Turnover Rate
- 输出缓存每秒增加或减少的数量。如果反复很大,则无法有效地使用缓存。
- Pipeline Instance Count
- 指定 ASP.NET 应用程序的活动请求管道实例的数量。因为在管道实例内只能运行一个执行线程,所以此数值给出了为某个应用程序处理的并发请求的最大数量。在大多数情况下,在具有负载时最好将此数值控制很低,这表明 CPU 的使用率很高。
- Request Bytes In Total
- 所有请求的总大小(以字节为单位)。
- Request Bytes Out Total
- 发送到客户端的响应的总大小(以字节为单位)。这不包括标准的 HTTP 响应头。
- Requests Executing
- 当前执行的请求数。
- Requests Failed
- 失败请求的总数。如果任何和全部状态代码大于或等于 400,就会增加此计数器。
注意 导致 401 状态代码的请求将增加此计数器和 Requests Not Authorized 计数器。导致 404 或 414 状态代码的请求将增加此计数器和 Requests Not Found 计数器。导致 500 状态代码的请求将增加此计数器和 Requests Timed Out 计数器。
注意 在拒绝请求(无法完成,因为拒绝是由 IIS 而不是由进程模型完成的)时,等价的 ASP 计数器也将增加。
- Requests Not Found
- 由于未找到资源而失败的请求数(状态代码 404、414)。
- Requests Not Authorized
- 由于无授权而失败的请求数(状态代码 401)。
- Requests Succeeded
- 已成功执行的请求数(状态代码 200)。
- Requests Timed Out
- 已超时的请求数(状态代码 500)。
- Requests Total
- 服务启动后的请求总数。
- Requests/Sec
- 每秒执行的请求数。它表示应用程序的当前吞吐量。在恒定负载下,此数值应处于特定的范围内(不包含其他的服务器工作,如垃圾回收、缓存清理线程和外部服务器工具等)。
- Sessions Active
- 当前活动会话的数量。该计数器只受内存中会话状态的支持。
- Sessions Abandoned
- 已明确放弃的会话数。该计数器只受内存中会话状态的支持。
- Sessions Timed Out
- 超时的会话数量。该计数器只受内存中会话状态的支持。
- Sessions Total
- 超时的会话数量。该计数器只受内存中会话状态的支持。
- Transactions Aborted
- 中止的事务数。
- Transactions Committed
- 提交的事务数。
- Transactions Pending
- 进行中的事务数。
- Transactions Total
- 服务启动后的事务总数。
- Transactions/Sec
- 每秒启动的事务数。