”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 Go 的“pprof”和 Docker 统计报告的内存使用情况不同?

为什么 Go 的“pprof”和 Docker 统计报告的内存使用情况不同?

发布于2024-12-22
浏览:600

Why Do Go\'s `pprof` and Docker Stats Report Different Memory Usage?

Go Tool Pprof 和 Docker Stats 之间的内存使用差异

使用 Go 1.11 时,您可能会遇到 Go 报告的内存使用情况存在差异工具 pprof (runtime.MemStats.sys) 和 docker stats。 Docker stats 依赖 cgroup 来获取内存使用信息,其中包括 Page Cache 和 Resident Set Size (RES)。另一方面,pprof 显示内存使用情况的模糊值,因此很难直接比较两者。

理解 cgroup 内存使用情况

cgroup 提供了一种方法限制和跟踪容器内的资源使用情况。 cgroups中的usage_in_bytes指标包括进程使用的内存和缓存内存。如果容器从主机系统读取文件,内核缓存的内存也会计入usage_in_bytes。

Docker 中回收内存

如果容器达到其内存限制,Docker 尝试回收未使用的内存。这与 OOM 错误不同,OOM 错误是在所有内存都被使用时发生的。

限制内存使用的方法

要控制 docker 容器的内存使用,您可以可以在 docker run 命令或 docker-compose.yml 文件中使用 mem_limit 指定内存限制参数。

结论

pprof 和 docker stats 之间内存使用报告的差异源于它们测量内存利用率的不同方式。 docker stats 使用的 cgroups 在其计算中包括文件缓存内存,而 pprof 则提供一个模糊值而不考虑缓存。通过 cgroup 管理内存限制,您可以防止容器中内存不受控制的增长。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3