none
Linux 上的 .NET 应用虚拟内存过大,以致于无法使用 dotnet-dump collect RRS feed

  • 问题

  • 我有一个在 Docker (Linux) 上运行的 .NET 应用程序(docker image: mcr.microsoft.com/dotnet/core/sdk:3.1),当我启动该.NET 应用程序时,它会分配约 15G 的虚拟内存(VM)。如果我直接在 Windows 上运行该应用程序,它仅仅消耗不到 300M 的内存。

    因此,我存在以下疑问:
    1、发生这种状况的原因是什么?
    2、我需要做些什么来避免这种情况?

    由于.NET 应用使用虚拟内存过大,进一步引发了一系列问题:

    1、无法使用 dotnet-dump collect 收集转储,以用于定位和分析.NET 应用程序运行时中发生的问题。因为大量的虚拟内存使用,导致从该 dotnet 进程创建的核心转储(coredumps)也太大了,以致于创建该应用程序的核心转储时因资源不足而发生失败。

    2、当 dotnet 进程因未知原因崩溃时,无法使用 dotnet crash dump 创建转储,用于分析 dotnet 进程崩溃的真实原因。因为大量的虚拟内存使用,导致该 dotnet 应用进程收集转储时间过长,严重影响应用程序可用性;甚至由于虚拟内存远远大(几十倍)于分配的物理内存资源,导致触发内存资源限制而失败,从而无法通过有效途径了解和分析dotnet 进程崩溃的原因。

    目前 GitHub(.NET)上已存在类似的 Issue:https://github.com/dotnet/runtime/issues/7740,但迟迟未得到解决,还请微软 .NET 相关部门能重视和解决。

    感谢。

    2021年7月7日 10:57