1

昨晚我在一个网站上做了一个负载测试。我发现我的一个共享缓存是一个瓶颈。我正在使用 ReaderWriterLockSlim 来控制数据的更新。不幸的是,大约有 200 个请求几乎在同一时间尝试更新数据。这也与 CPU 使用率峰值相吻合。

正在更新的数据位于 ASP.NET 缓存中。我想做的是如果 CPU 使用率在 75% 左右,我想跳过缓存并在另一台机器上访问数据库。

我的问题是我不知道创建一个新的性能计数器来检查 CPU 使用情况有多昂贵。另外,如果我可能想要过去 2 或 3 秒内的平均 CPU 使用率。但是,我不能坐在那里计算 CPU 时间,因为这比当前更新缓存所需的时间更长。

有没有一种简单的方法来获得平均 CPU 使用率?这有什么缺点吗?

我还在考虑总计锁定的等待计数,然后在某个阈值切换到数据库。我对这种方法的担忧是,改变硬件可能会允许更多的锁,而对系统的压力更小。并且为阈值找到正确的平衡也很麻烦,并且没有考虑机器上的任何其他负载。但这是一种简单的方法,而且简单在 99% 的情况下都更好。

4

1 回答 1

1

Microsoft 的这篇文章涵盖了调整 .Net 应用程序性能,并重点介绍了要收集和比较哪些计数器以确定 CPU 和 I/O 绑定应用程序。

您听起来好像想在执行过程中监视它,并在事情变得密集时绕过缓存。这不只是将密集处理从缓存调用转移到数据库调用吗?当然你有缓存来避免昂贵的数据库调用。

您是否尝试重新填充无效的缓存?从缓存中提供陈旧数据有什么影响?您可以锁定重新填充功能并将陈旧数据提供给其他请求,直到该过程完成。

基于上述文章,我们在测试期间收集了以下计数器对象,这为我们提供了所有必要的计数器来确定瓶颈。

  • .NET CLR 异常
  • .NET CLR 内存
  • ASP.NET 应用程序
  • ASP.NET
  • 记忆
  • 分页文件
  • 处理器
  • 线

CLR 调优ASP.NET 调优一文中的部分重点介绍了可能发生的瓶颈,并建议更改配置以提高性能。我们当然对线程池设置进行了更改以获得更好的性能。

更改和检索性能计数器值可能有助于通过代码访问现有的处理器计数器,但这不是我个人尝试过的。

于 2010-05-24T15:38:26.313 回答