我正在尝试在 Windows 容器中托管 .NET 4.8 Web 应用程序。该应用程序使用 COM 互操作与一些旧组件进行交互。
我从通过启用了 Docker 的 Visual Studio 创建的 .NET 4.8 Web API 项目开始。在我的机器上一切都运行良好。我能够通过 JMeter/POSTMAN 发送数百个请求而不会出现错误,并且我的机器上的内存使用量似乎不超过 1GB。
当我在 Azure 应用服务中托管容器时,它在 10-11 个请求后抛出内存不足异常。这种情况相当一致地发生。
我尝试扩大应用服务计划。我发现默认情况下,Azure 应用服务中的 Windows 容器内存限制为 1.5 GB,因此我使用应用程序设置将此值增加到 10GB,并且我能够在部署中心确认该容器是使用 10GB 内存创建的。内存,但它仍然很快就会耗尽内存。
我最终能够在自己的机器上重现此行为,事实证明,无论我将内存限制设置多高(我已经尝试过 20 GB)...使用“-m”参数指定的任何值都是导致性能不可接受。
简而言之:
docker run -m 25GB -P <containername>:<tag>
不起作用,但是:
docker run -P <containername>:<tag>
有效。
我猜这个 -m 参数在幕后发生的事情一定比表面上看到的更多。
docker 文档还有一些与内存使用相关的其他参数,但是当我传递这些标志时,我收到错误消息,Windows 容器不支持它们。
有什么想法吗?此时,我可能不得不放弃使用 Azure 应用服务,而将容器托管在我自己的 VM 中,以便我可以控制完整运行命令并确保不传递 -m 参数。
在 Azure 应用服务中,我们使用 Hyper-V 隔离运行,因此要将其与应用服务进行比较,请使用 --isolation=hyperv 选项。
在 Azure 应用服务中,每个容器将以最小 1GB 启动,但您可以使用应用程序设置 WEBSITE_MEMORY_LIMIT_MB 来控制要从主机共享到容器的内存量。
如果问题仍然存在,请开具支持票,我们将为您提供帮助: