【问题标题】:How do I reduce memory usage for .NET Core docker containers?如何减少 .NET Core docker 容器的内存使用量?
【发布时间】:2018-02-13 08:44:37
【问题描述】:

我们在 Docker/Ubuntu 上运行 .NET Core 1.1 容器,托管 Web API。这些容器基于microsoft/aspnetcore:1.1.2,其中包含为 Ubuntu x64 平台发布的二进制文件,并在构建映像时复制进来,非常简单。

目前,我们的 Web API 也非常简单,最多只有几个控制器从 SQL Server 中提取数据。它们没有显着的缓存或任何不寻常的东西,但在运行时每个都使用 500-900 Mb 的 RAM。这不是由于内存泄漏 - 每个容器的内存使用量随着时间的推移是稳定的,在使用过程中上下变化 10-15Mb。

这种级别的 RAM 使用应该是完全没有必要的 - 我怎样才能减少它?

我已经查看了Docker container memory use 的问题,但它有所不同,目前没有答案。

【问题讨论】:

  • 限制容器的最大内存量。大多数应用程序(包括数据库服务器)都会尝试获取尽可能多的内存来运行,然后查看您的应用程序是否可以在该限制内运行
  • 是的,谢谢,这在一定程度上有效,但我看到容器没有使用更少的内存,内存只是移动到交换中,这会降低 API 的性能。

标签: ubuntu docker memory asp.net-core .net-core


【解决方案1】:

我已经尝试了几种方法来解决这个问题,并且得到了 .NET Core 团队的回复,所以我会在此处记录以防它对其他人有用。

1) 我已经成功地使用标志在 Docker 容器命令行上指定内存限制,例如。 --memory="200m" --memory-swap="500m";这可以用来控制内存使用,防止服务器意外耗尽内存,但我看到的是容器所需的内存并没有显着减少,它只是被强制交换,从而降低了性能API。我还没有尝试过--memory="200m" --memory-swap="200m"(即不允许交换)——如果有机会我会这样做,我怀疑 API 会抛出 Out Of Memory 异常,或者被严重降级。

2) .NET 1.1 的最佳解决方案(如果您需要限制内存)似乎是将 GC 切换到工作站模式,方法是将 <ServerGarbageCollection>false</ServerGarbageCollection> 放入 .csproj 文件 PropertyGroup 部分。就我而言,这会将每个容器的内存使用量降至 80-100mb。服务器垃圾收集旨在处理大量并发期间的内存清理,因此如果您正在构建遇到此问题的 API 或站点,这可能不是一个好的解决方案,但我们的 API 的并发用户数量很少,所以它似乎可以工作好吧。

长期,CoreCLR 团队的@janvorli 给了我一个有用的回复。显然,这个问题是由 .NET Core GC 中的一个错误引起的,该错误将在即将发布的 2.0.2 版本中修复。您可以阅读详细信息 this issue on the Github repo(搜索“ettery”)。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2017-11-06
    • 2019-03-25
    • 1970-01-01
    • 2018-07-12
    • 2021-12-12
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多