排除MVC4 Web API性能问题

4
我有一个asp.net mvc4的web api接口,平均每天收到大约54,000个请求。
这是一个示例请求链接:http://myserv.x.com/api/123/getstuff?whatstuff=thisstuff 我有3台Web服务器位于负载均衡器后面,用于处理HTTP请求。平均响应时间约为300毫秒。然而,最近有些异常情况 (或者可能一直存在),响应时间会不时地在10-20秒之间波动。在这种情况下,相同的请求直接命中同一台服务器,而不是经过负载均衡器。
GIVEN:
- System has been passed down to me so there may be gaps with IIS confiuration, etc,.
- Database: SQL Server 2008R2
- Web Servers: Windows Server 2008R2 Enterprise SP1
- IIS 7.5
- Using MemoryCache aggressively with Model and Business Objects with eviction set to 2hrs
- Looked at the logs but really don't see anything significantly relevant
- One application pool...no other LOB applications running on this server

假设与询问: 我在思考是否有些东西正在重启应用程序池或IIS工作线程正在关闭和重新启动,从而导致每个新请求都需要热身并重新缓存自己。这种情况如此零散,以至于现在很难进行故障排除。相同的请求发送到相同的服务器会像预期的那样快速返回(连续的N个请求),因为它在约300ms内被缓存...但等待大约5-10-20分钟后,同一请求发送到相同的服务器需要16秒才能完成。
由于这些是生产系统,因此我只能提供有限的跟踪信息。如果有人遇到过此类问题或类似行为的信息,请帮忙提供任何有用的信息和攻略。谢谢。
更新: w3wpe.exe进程增长到了~3G。不知何故,它被清除了,PID也发生了变化,所以它本身或某些东西每3-4分钟就会被杀死。我在我的Web服务器(IIS)日志中看到了大量警告:
“为应用程序池‘MyApplication’服务的进程与Windows进程激活服务遭遇致命通信错误。进程ID是'1732'。数据字段包含错误号。”

@TabishSarwar:你好,我对缓存命中还是新手,但是清除策略已设置为每2小时过期一次。 - genxgeek
@TabishSarwar:当然,在最初的调查阶段,可能有很多事情需要考虑。硬件方面可能会有哪些问题?您认为这是否与工作线程IIS的启动和关闭或IIS配置问题有关...应用程序池循环有关吗? - genxgeek
如果您的应用程序一直正常工作,您确保没有部署应用程序更改,突然出现了问题。我将尝试观察发生了什么。查看日志/调用模式...如果它们看起来正常,可能存在网络问题、重新路由问题导致交换机/路由器延迟...可能是IIS...可能是缓存未按预期行为...可能是数据库索引问题...可能是服务器内存飙升。此时我将制作一个清单,逐个排除它们。 - Tabish Sarwar
刚刚更新了案例描述。 - genxgeek
我不确定您是否已经解决了您的问题。您可以检查应用程序池高级设置中的一个更多内容,即启用32位应用程序设为true。 - Tabish Sarwar
显示剩余6条评论
1个回答

4
经过4-5天的评估IIS和配置与内部代码问题,我最终找到了问题,几乎没有windbg或debugdiag IIS工具的帮助。 这些工具包含如此多的信息,即使是小型转储或日志跟踪堆栈,它们也可能会误导人。 最好的方法是通过设置"智能复制"生产系统的实例来复现它,但当时我们并没有这样的实例,运营部门需要一些时间去设置。

不用说,问题与业务对象的超级缓存有关。 有一个竞争条件,其中某个表格上的更新正在更新对应业务对象的属性(更新来自多个服务器),这导致了一个OOC stackoverflow,基本上会使缓存递归地死亡,从而导致w3wp.exe进程死亡和伪循环。 这是一个极难在非生产环境下测试和再现的边缘情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接