调试和诊断.NET中的锁定转发问题

我正在研究大型C#/ .NET 3.5系统的性能问题,该系统表现出性能下降,因为发出请求的用户数量每秒可扩展到40-50个不同的用户请求。

请求持续时间显着增加,而CPU和I / O负载似乎保持不变。 这让我相信,我们的系统中使用c# lock() {...}语句保护的共享对象如何影响并发访问性能可能会遇到问题。 具体来说,我怀疑在关键部分保护的常用共享数据上会发生某种程度的锁定会话(因为它是读/写)。

有没有人建议如何实际诊断锁定康复是否是问题..或者任何类型的锁争用是否导致长请求时间?

锁定车队一般很难调试。 您的代码路径是直接还是在分支中具有顺序锁定语句?

Total of of Contentions性能计数器给出了app中争用的基本估计值。

同时打开一个探查器并查看。 您还可以编写一些perf计数器来跟踪代码路径的慢速部分。 还要确保只在绝对必要时保持锁定。

另请参阅Windows性能工具 。 我发现这些非常有用,因为你可以追踪很多低级问题,比如exception的上下文切换量。

一个好的起点是看看Lock和Thread性能计数器 。 有趣的是你在Web应用程序中锁定了什么? 锁定大多数ASP.NET应用程序并不常见。

我无法提供有关诊断的深入见解,但如果您找到证据来支持您的假设,那么您可能对System.Threading.ReaderWriterLockSlim感兴趣,它允许并发读取,但会阻止并发写入。