huanggzeK零SK壹S
- 已编辑
最近发现一个问题,部署了多副本的 Java 应用程序,kubesphere 显示各 Pod 间内存使用不一样,甚至相差较大?对比 docker stats 和进入容器终端打印 top,发现:(1)docker stats 结果确实不一样(2)但 top 显示的结果相差无几。这是什么原因?
docker 一直以来在统计应用程序的实际内存使用(不含缓存)上不统一,有争论。即,docker stats MEM 与 top RES 打印的数值不一样。docker stat 数值更高。目前正在使用的 docker 版本采用的计算方式为 usage_in_bytes - cache,数据来源:cgroup memory.stat 文件。这种计算方式导致有部分缓存文件占用的内存未除尽。直到 19.03.9 版本,调整为 usage_in_bytes - total_inactive_file
由于 docker 是 k8s 主要的运行时,kubesphere 暂与 docker stat 保持一致。就最开始的问题而言,只看 top RES 数值,各 pod 内应用程序资源消耗是均匀的。针对这个问题,kubesphere 会继续评估是否调整内存统计以及如何调整。
官方资料:
- docker issue:https://github.com/moby/moby/issues/10824
- cgroup 文档(memory 部分):https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
- docker 修复 pr:https://github.com/docker/cli/pull/2415
延伸阅读:
- Analyzing java memory usage in a Docker container:http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/