Go Tool Pprof 和 Docker Stats 之间的内存使用差异
在使用 Go 1.11 时,您可能会遇到 Go 报告的内存使用情况的差异工具 pprof (runtime.MemStats.sys) 和 docker stats。 Docker stats 依赖 cgroups 来获取内存使用信息,其中包括 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 管理内存限制,您可以防止容器中内存不受控制的增长。
以上是为什么 Go 的'pprof”和 Docker 统计报告的内存使用情况不同?的详细内容。更多信息请关注PHP中文网其他相关文章!