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 服务器重现此行为,使用此设置一切正常,没有发生挂起。
任何人都可以阐明这个神秘的问题吗?问题的原因是什么,是否有任何解决方法?
我的配置如下:
- .NET Framework 4.8
- Windows 10 专业版(1909 版)
- RAM:32 GB(启用了固定大小的交换空间 - 24 GB)
- 服务器:Microsoft-IIS/10.0
我深入挖掘并在 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 - 并且工作正常)
我在使用 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 服务器重现此行为,使用此设置一切正常,没有发生挂起。
任何人都可以阐明这个神秘的问题吗?问题的原因是什么,是否有任何解决方法?
我的配置如下:
- .NET Framework 4.8
- Windows 10 专业版(1909 版)
- RAM:32 GB(启用了固定大小的交换空间 - 24 GB)
- 服务器:Microsoft-IIS/10.0
我深入挖掘并在 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 - 并且工作正常)