3

我们有一个相当受欢迎的网站,每月有大约 400 万用户。它托管在具有 16 GB RAM、2 个具有 24 个内核的 procc 的专用盒上。

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

我查看了他的性能计数器,发现了一些非常有趣的东西。在我们的窥视时间,出于某种原因,请求正在排队。总体上下文切换数量非常高,约为 30 - 110 000 k。

据我了解,高上下文切换是由锁引起的。谁能给我一个会导致大量上下文切换的示例代码。

4

1 回答 1

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 文件压缩。此外,对静态内容使用过期标头,因此它们会缓存在客户端上,这将节省大量带宽。
  4. 在您的 ASP.NET 控制器、处理程序等中尽可能使用异步 IO(从磁盘、数据库、网络等读取/写入),以确保您以最佳方式使用线程。使用阻塞 IO 阻塞可用线程(这在我见过的 95% 的 ASP.NET 应用程序中完成)很容易导致线程池在重负载下被充分利用,并且会发生排队。
  5. 做一个一般性的优化,以防止命中服务器的请求数量,以及单个请求的处理时间。这可以包括缩小和捆绑您的 CSS/JS 文件,重构您的 Javascript 以减少与服务器的往返次数,重构您的控制器/处理程序方法以更快等。我在下面添加了指向 Google 和 Yahoo 推荐的链接。
  6. 在 IIS 中禁用 ASP.NET 调试。

谷歌和雅虎推荐:

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

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

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

于 2014-09-17T21:28:53.530 回答