ASP.NET 5 Web API 应用程序间歇性无响应

ASP.NET 5 Web API application intermittently unresponsive

我们正在开发一个 ASP.NET 5 Web API 项目,该项目目前正在生产中,但我们遇到了一个问题,它在一天中间歇性地变得无响应。

关于应用程序架构的一些注意事项。它是一个 ASP.NET Web API 项目,在同一专用网络中的单独 EC2 实例上使用 MariaDB 数据库。连接字符串使用数据库服务器的私有 IP 来避免任何名称解析问题。该站点通过 IIS 10 托管。

应用程序本身是根据 Microsoft 提供的最佳实践精心开发的。重点关注异步操作,最大限度地减少查询响应时间并将更昂贵的操作卸载到后台服务中。

该应用程序响应速度极快。它对几乎所有请求执行不到 100 毫秒的响应,即使是更复杂的请求,并且一直到它变得无响应为止,这种高水平的性能保持不变。我们倾向于在高峰使用时看到每秒 10-30 个请求和每秒 300-500 select 个查询,所以不要太极端。但是,随机(24 小时内 2-3 次)它将开始挂起请求并且根本不响应请求。在此期间,数据库的响应速度仍然非常快,我们的连接数永远不会超过 512 个连接限制中的 300 个。

应用服务器本身的资源从来没有被真正占用太多。 CPU 永远不会超过 ~20%,内存使用率在 20-30% 左右。

如果我在 IIS 中停止站点并在发生这种情况时重新启动它,它会很快恢复在线。如果我不这样做,它会停机几分钟,直到 IIS 由于健康检查失败而最终将其杀死。除了由进程挂起导致的典型错误(例如连接终止错误)之外,没有生成真正的错误作为对该问题的响应。我之前看到的唯一让我停顿的是从池中获取连接时有一些连接超时的事实,但就像我说的那样,与服务器的连接永远不会接近限制。

此外,这个应用程序和版本已经投入生产几个月了,直到流量开始增长,我们才开始看到这些问题。此时,我对后续的故障排除步骤一头雾水,正在寻求建议。

在 IIS 应用程序池高级设置中,将 Start Mode 设置为 AlwaysRunning

我从未找到此问题的根本原因,但是,在更新到较新版本的 .NET MVC 后,此问题就消失了。我最好的猜测是 Kestrel 的变化可能解决了这个问题,尽管我不知道具体的变化是什么。我已经浏览了几次更改日志,但没有看到任何特别针对我的内容。