【问题标题】:Debugging and diagnosing lock convoying problems in .NET在 .NET 中调试和诊断锁护送问题
【发布时间】:2010-11-23 20:36:44
【问题描述】:

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

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

是否有人对如何实际诊断是否存在锁护送问题..或者任何类型的锁争用导致请求时间过长有什么建议?

【问题讨论】:

    标签: c# .net asp.net multithreading concurrency


    【解决方案1】:

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

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

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

    还可以查看Windows Performance Tools。我发现这些非常有用,因为您可以跟踪许多低级问题,例如异常数量的上下文切换。

    【讨论】:

      【解决方案2】:

      查看Lock and Thread performance counters 是一个很好的起点。出于有趣,您在 Web 应用程序中究竟锁定了什么?在大多数 ASP.NET 应用程序中锁定并不常见。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-10
          • 2021-08-01
          相关资源
          最近更新 更多