3

你们所有人都同意将性能计数器用于服务器应用程序的价值。

我想知道如何使用 C# 来实现这些。

通常性能计数器具有以下属性:

  1. 它们是共享的/全局的
  2. 写入需要锁来保证同步
  3. 阅读有时也需要锁

异步更新它们会更好吗?使它们异步的最佳方法是什么?

我打算使用 ThreadPool.QueueUserWorkItem() 函数。您对此有何看法?

如果我的问题看起来有点模糊,请查看 HelloWorld WCF 服务。

我还想知道以下内容:

  1. 在特定时期内总体被击中多少次
  2. 总体和特定时期内的平均/最小/最大响应时间

如果有人知道在 .NET 或 WCF 中执行此操作的任何专门方法,请告诉我。

4

2 回答 2

3

如果您为此目的使用.NET 类,则无需手动锁定性能计数器的递增、递减和查询 - 框架会为您执行此操作。

如果您需要在本机代码中使用性能计数器,您仍然应该使用 InterlockedIncrement() 和朋友。

我认为异步更新性能计数器不是一个好主意,但你的里程可能会有所不同。如果有关某些有趣情况的数据是在事后到达的,则它可能被认为不太有用。在所有情况下,我都不会仅仅为了更新性能计数器而对 ThreadPool 施加压力。现在,如果您无论如何都需要在线程中执行触发计数器的工作,那当然会有所不同。

一般来说,我认为性能计数器的更新并不是真正的瓶颈,而是用于更新计数器的数据的收集。

例如,.NET GC 内存性能计数器仅在 GC 实际发生时更新,因为跟踪信息(在后台)只是为了每次更新计数器的机会太昂贵(抱歉,这里没有参考,但是有一些关于该特定主题的 MS 博客条目)。

最后,请注意,WCF 已经提供了相当多的开箱即用的计数器,这可能已经涵盖了您现在想要的所有内容。

于 2010-04-01T12:55:48.963 回答
1

您可以使用标准的 Windows 性能计数器。

可以使用 system.diagnostics.performancecounter 命名空间从 c# 访问此功能。有关 C# 示例,请参见:

http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx

于 2010-04-01T12:25:28.093 回答