ASP.NET 当 RAM 相对较低时 MVC 请求挂起

ASP.NET MVC request hangs when RAM is relatively low

我在使用 ASP.NET MVC 和 IIS 时遇到了以下神秘问题。我有一个非常简单的控制器:

public class SimpleController : Controller
{
    public ActionResult Huge()
    {
        return Content(new string('a', 3000000));
    }

    public ActionResult Small()
    {
        return Content(new string('a', 1000000));
    }
}

如果我 运行 使用 IIS Express 的这个示例或使用普通 IIS 的更复杂的示例,有时我会遇到一个问题,即对 /Huge 方法处理程序的请求只是挂起:在浏览器中,它看起来像无限页面加载,在 Wireshark 中我看到 TCP 连接打开但在此之后,没有来自服务器的 activity (我也尝试通过 requests 库和 python 发出原始请求和在这种情况下,它也会挂起 /Huge 方法处理程序)。另一方面,对 /Small 方法处理程序的请求工作正常。

我发现,使用相对少量的可用 RAM 可以稳定地重现此行为。但这对我来说很奇怪:Process Explorer 显示至少有 8GB 的​​ RAM 可用(当只有不到 8GB 的​​免费 space 可用时,问题重现,但是有更多 space 这两个控制器都工作正常)

我还尝试使用 ASP NET Core 和 Kestrel 服务器重现此行为,使用此设置一切正常,没有发生挂起。

任何人都可以阐明这个神秘的问题吗?问题的原因是什么,是否有任何解决方法?

我的配置如下:

我深入挖掘并在 HTTP.sys 日志文件 (C:\Windows\System32\LogFiles\HTTPERR\httperr1.log) 中发现了错误。带有以下标记的请求出错:Connection_Abandoned_By_ReqQueue。此信息帮助我找到一个关于类似问题的博客 post:https://mvolo.com/low-pagefile-can-cause-503-service-unavailable-on-azure-web-roles/

建议的解决方法是增加交换大小。我这样做了(将交换空间增加 64GB 以确保 IIS 对此感到满意)- 问题 已解决

无论如何,我不明白 IIS 有什么问题以及为什么它不能在我的初始设置中使用可用内存(ASP NET Core 中的 Kestrel 可以处理请求,我写了一个虚拟应用程序,它只是分配一些内存 - 5-8GB - 并且工作正常)