use*_*471 6 memory-management datadog
我们有一个在 docker 容器内运行的 .net core 服务,用于处理用户上传的文件。某些传入请求的文件大小高达 20 MB。应用程序将文件作为二进制 blob 保存到 Aurora DB 并执行其他处理步骤。最近,服务负载增加,datadog 显示内存使用百分比约为 99%。CPU利用率只有2%左右。我们预计会发生内存泄漏,从而导致容器内存不足。但现在流程似乎运行良好一段时间了。此外,RSS 内存仅为 15%(4 GB 容器上为 650 MB)。我试图了解这两个内存指标的差异,以及内存泄漏导致的高内存使用率结果。这个过程至关重要,我们希望采取一切必要措施来确保稳定性。我们正在分析该应用程序的内存优化,但到目前为止无法确定任何主要内容。
这听起来与我们团队在 Datadog 上的经历非常相似。一段时间以来,我们收到了 Pod 内存不足的警报。重新启动这些 Pod 通常可以解决问题。图表显示内存使用量在一个月内稳步增加,直至达到峰值。
我们深入研究了这个问题,发现 datadog 正在报告已使用的+缓存的内存,这导致了不正确的指标。操作系统正在缓存文件句柄。通常,缓存内存可供使用,并在需要更多内存时由操作系统自动释放。也可以手动冲洗as shown here.
要确认这一点,您可以进入容器并运行cat /proc/meminfo。这将为您提供容器内存使用情况的详细信息。这是我得到的
MemTotal: 6504577 kB
MemFree: 1888762 kB
MemAvailable: 4357572 kB
Buffers: 310 kB
Cached: 2230122 kB
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,MemAvailable远大于MemFree并且内存中存在大量缓存数据。