asp.net请求队列和上下文切换的数量很大

时间:2012-12-20 13:29:44

标签: asp.net performance

我们有一个相当受欢迎的网站,每个月有大约4万用户。它托管在一个专用盒子上,配有16 gb Ram,2个procc,24个内核。

在任何给定时间,CPU始终低于40%且内存低于12 GB,但在最高流量时,我们发现性能非常差。该网站非常慢。我们有2个应用程序池,一个用于我们的主站点,另一个用于我们的论坛只有网站很慢。我们对每个应用程序池的cpu或内存没有任何限制。

我看过他的表演专柜,我看到了一些非常有趣的东西。在我们偷看时间由于某种原因请求排队。总体上下文切换数量非常高,约为30-110 000 k。

据我所知,高上下文切换是由锁引起的。任何人都可以给我一个示例代码,这将导致大量的上下文切换。

1 个答案:

答案 0 :(得分:1)

我不太关心环境转换,我不认为这些数字是巨大的。你有很多线程在IIS中运行(因为它是24核心机器),并且预期会有更高的上下文切换数。但是,我绝对关心请求排队。

我会做几件事,看看它会如何影响你的表现指标:

  1. 您的服务器CPU显然未得到充分利用,因为您的所有时间都低于40%。您可以尝试设置更高的"每个处理器限制的线程数"在IIS中,直到达到50-60%的利用率。书中每个核心的最佳线程值为20,但这取决于场景,您可以尝试更高或更低的值。我建议尝试设置值> = 30。低CPU利用率也可能是阻止IO操作的标志。
  2. 调整"队列长度" IIS属性中的设置。如果您已配置"每个处理器的线程限制"为了20,那么你应该将队列长度配置为20 x 24核= 480.再次,如果请求被排队,这可能表示所有线程都被阻止服务于其他请求或被阻止等待IO响应
  3. 不要从IIS提供静态文件。将它们移动到CDN,亚马逊S3或其他任何地方。这将显着提高您的服务器性能,因为1,000个服务器请求将转移到其他地方!如果你必须从IIS提供文件,而不是配置IIS文件压缩。另外,为静态内容使用expire头,因此它们会缓存在客户端上,这将节省大量带宽。
  4. 尽可能使用Async IO(从磁盘,数据库,网络等读取/写入)在ASP.NET控制器,处理程序等中,以确保您以最佳方式使用线程。使用阻塞IO阻塞可用线程(这在我生命中看到的95%的ASP.NET应用程序中完成)很容易导致线程池在高负载下被充分利用,并且会发生排队。
  5. 执行常规优化以防止命中服务器的请求数量以及单个请求的处理时间。这可以包括缩小和捆绑你的CSS / JS文件,重构你的Javascript以减少对服务器的往返,重构你的控制器/处理程序方法更快等等。我在下面添加了谷歌和雅虎建议的链接。
  6. 在IIS中禁用ASP.NET调试。
  7. 谷歌和雅虎的建议:

    https://developers.google.com/speed/docs/insights/rules

    https://developer.yahoo.com/performance/rules.html

    如果您遵循所有这些建议,我相信您会得到一些改进!