Rethinkdb容器:rethinkdb进程占用的RAM比整个容器less

我正在Kubernetes集群中运行我的rethinkdb容器。 以下是我注意到的:

在CoreOS的主机上运行,​​rethinkdb进程需要3Gb:

 $ top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 981 root 20 0 53.9m 34.5m 20.9m S 15.6 0.4 1153:34 hyperkube 51139 root 20 0 4109.3m 3.179g 22.5m S 15.0 41.8 217:43.56 rethinkdb 579 root 20 0 707.5m 76.1m 19.3m S 2.3 1.0 268:33.55 kubelet 

但运行docker stats检查rethinkdb容器,它需要大约7Gb!

 $ docker ps | grep rethinkdb eb9e6b83d6b8 rethinkdb:2.1.5 "rethinkdb --bind al 3 days ago Up 3 days k8s_rethinkdb-3.746aa_rethinkdb-rc-3-eiyt7_default_560121bb-82af-11e5-9c05-00155d070266_661dfae4 $ docker stats eb9e6b83d6b8 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O eb9e6b83d6b8 4.96% 6.992 GB/8.169 GB 85.59% 0 B/0 B $ free -m total used free shared buffers cached Mem: 7790 7709 81 0 71 3505 -/+ buffers/cache: 4132 3657 Swap: 0 0 0 

有人可以解释为什么容器比rethinkdb进程本身需要更多的内存吗?

我正在运行dockerv1.7.1,CoreOS v773.1.0,内核4.1.5

top命令中,您正在查看物理内存量。 在stats命令中,这也包括磁盘cachingram,所以它总是大于ram的物理量。 当你真的需要更多的RAM时,caching的磁盘将被释放以供应用程序使用。

实际上,通过cgroup memory.usage_in_bytes获取内存使用情况,您可以在/sys/fs/cgroup/memory/docker/long_container_id/memory.usage_in_bytes访问它。 并根据linux文档https://www.kernel.org/doc/Documentation/cgroups/memory.txt第5.5节:

5.5 usage_in_bytes

为了提高效率,与其他内核组件一样,内存cgroup使用一些优化来避免不必要的cacheline错误共享。 usage_in_bytes受该方法的影响,并不显示内存(和交换)使用的“确切”值,这是高效访问的模糊值。 (当然,必要时,它是同步的)。如果你想知道更准确的内存使用情况,你应该在memory.stat中使用RSS + CACHE(+ SWAP)值(见5.2)。