服务器开发中的性能计数器

时间:2010-04-01 05:35:33

标签: .net wcf performancecounter

大家都同意将性能计数器用于服务器应用程序的价值。

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

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

  1. 他们是共享/全球
  2. 写入需要锁定以确保同步
  3. 阅读有时也需要锁定
  4. 以异步方式更新它们会更好吗?使它们异步的最佳方法是什么?

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

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

    我也想知道以下内容:

    1. 在一段时间内被击中的次数
    2. 整体和一定时期内的平均/最小/最大响应时间
    3. 如果有人知道在.NET或WCF中执行此操作的任何专门方法,请告诉我。

2 个答案:

答案 0 :(得分:3)

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

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

我认为异步更新性能计数器不是一个好主意,但你的milage可能会有所不同。如果关于某些有趣情况的数据在事后发生,则可以认为它没那么有用。在所有情况下,我都对ThreadPool施加压力只是为了更新性能计数器。现在,如果你需要做一个在线程中触发计数器的工作,那当然会有所不同。

通常,我认为性能计数器的更新确实不是瓶颈,而是收集用于更新计数器的数据。

例如,.NET GC内存性能计数器仅在GC实际发生时更新,因为跟踪信息(在后台)只是为了更新计数器每次都有可能太昂贵(抱歉,这里没有参考,但是关于那个特定主题的MS博客文章有一个很好的结合。)

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

答案 1 :(得分:1)

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

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

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