ASP.NET高CPU将服务器引入其膝盖

好的,我们的新版本在每个服务器上都有100%的CPU峰值,随机间隔。 长时间使网站完全没有响应 – 这将是在不同国家的人login网站等高峰时间。

我们已经看了perfmom,内存分析器,CLR分析器,sql分析器,红门ant分析器,在UAT尝试负载testing – 但甚至不能重现的问题。 这可能意味着只有数以千计的用户击中现场,导致它发生。

我们注意到的一种模式是,新的代码 – 破碎的版本 – 实际上使用的线程less得可怜。

我们也在使用国际奥委会的spring – 这是否有一个名声?

更糟糕的是,由于业务影响,我们无法进行部署,因此无法将问题缩小到我们添加的新function的子集。

我们真的被摧毁 – 有没有人有任何可能拯救我们几条命的战斗伤痕?

我build议做记忆转储,并与Sos在WinDdg中进行分析。 我解决了一些我们生产中的问题,如果没有WinDbg,我可能无法诊断。

苔丝·费尔南德斯(Tess Fernandez)有很棒的博客,你可以在这里学习如何分析内存转储。

这通常是由GC中长时间的大对象清理引起的( stackoverflow有这个问题,请参阅链接 )。 你是否将大量对象集合存储在caching或会话中?

GC攻击

我也build议你build立和configuration一个新的生产服务器来testing。 如果你有随机的疯狂,不知道为什么,也不能重现它,我会把手指指向硬件或configuration,而不是代码。

这是一个共享资源或物理服务器的虚拟服务器? 如果是前者,也许你可以看看这个服务器的专用资源。 祝你好运…

尝试使用cache server作为Apache Traffic Server (ATS)等前端。

虽然这不能解决问题,但可能有助于识别问题,因为您同时将来自后端的潜在有害负载(查看前端是否有问题),并使后端的热量减less,更容易看到什么是错的。

试图在没有数据的情况下猜测错误是毫无意义的。 是的,在计算器上或工程团队中的某个人可能会很幸运,但是这只是一个糟糕的工程,而且你不能计划每个猜测会花费多less时间,如果你甚至会发现问题。

  1. 你必须重现这个问题。 Jmeter是一个很好的开始,因为它的广度,但是我们不能在不知道我们的架构的情况下推荐正确的工具。
  2. 特别logging你的应用层是必须的。 您可以启用IIS跟踪以降低性能,但是Microsoft的木偶使得它在缓慢时无法捕获整个pipe道stream。 如果难以复制,你真的很喜欢一些日志来帮助你缩小问题的位置。 (就像哦,只要我们调用这个存储过程)。

100%的CPU是有点可疑的,因为它不太可能是I / O(提供数据库是另一个盒子,一个缓慢的数据库不应该导致Web服务器100%的CPU)。 你需要靠近家。