服务器开发中的性能计数器
Posted
技术标签:
【中文标题】服务器开发中的性能计数器【英文标题】:Performance Counters in Server Development 【发布时间】:2010-04-01 05:35:33 【问题描述】:你们所有人都同意将性能计数器用于服务器应用程序的价值。
我想知道如何使用 C# 来实现这些。
通常性能计数器具有以下属性:
-
它们是共享的/全局的
写入需要锁以确保同步
阅读有时也需要锁
异步更新它们更好吗?使它们异步的最佳方法是什么?
我打算使用 ThreadPool.QueueUserWorkItem() 函数。您对此有何看法?
如果我的问题看起来有点模糊,请查看 HelloWorld WCF 服务。
我还想知道以下内容:
-
在一定时期内整体被击中的次数
总体和特定时期内的平均/最小/最大响应时间
如果有人知道在 .NET 或 WCF 中执行此操作的任何专门方法,请告诉我。
【问题讨论】:
我已经看过一些特殊课程来完成这项任务,但我不知道任何人都可以帮助我分享一些关于这些的文章。 【参考方案1】:如果您为此目的使用.NET classes,则无需手动锁定性能计数器的递增、递减和查询 - 框架会为您完成。
如果您需要在本机代码中使用性能计数器,您仍然应该使用 InterlockedIncrement() 和朋友。
我认为异步更新性能计数器不是一个好主意,但你的里程可能会有所不同。如果有关某些有趣情况的数据是在事后到达的,则它可能被认为没那么有用。在所有情况下,我不会仅仅为了更新性能计数器而对 ThreadPool 施加压力。现在,如果您无论如何都需要在线程中执行触发计数器的工作,那当然会有所不同。
一般来说,我认为性能计数器的更新并不是真正的瓶颈,而是用于更新计数器的数据的收集。
例如,.NET GC 内存性能计数器仅在 GC 实际发生时更新,因为跟踪信息(在后台)只是为了在每次发生某些事情时更新计数器成本太高(对不起,这里没有参考,但是有一些关于该特定主题的 MS 博客条目)。
最后,请注意WCF already provides 相当多的开箱即用计数器,这可能已经涵盖了您现在想要的所有内容。
【讨论】:
【参考方案2】:您可以使用标准的 Windows 性能计数器。
可以使用 system.diagnostics.performancecounter 命名空间从 c# 访问此功能。有关 C# 示例,请参阅:
http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx
【讨论】:
以上是关于服务器开发中的性能计数器的主要内容,如果未能解决你的问题,请参考以下文章