docker - Rethinkdb容器:rethinkdb进程占用的RAM比整个容器少

标签 docker kubernetes rethinkdb

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

在CoreOS主机中运行top,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进程本身占用更多的内存吗?

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

最佳答案

top命令中,您正在查看物理内存量。在stats命令中,这还包括磁盘缓存的ram,因此它总是大于ram的物理量。当您确实需要更多RAM时,将释放缓存的磁盘供应用程序使用。

实际上,内存使用量是通过cgroup memory.usage_in_bytes提取的,您可以在/sys/fs/cgroup/memory/docker/long_container_id/memory.usage_in_bytes中访问它。并根据linux doc https://www.kernel.org/doc/Documentation/cgroups/memory.txt 5.5节:

5.5 usage_in_bytes

For efficiency, as other kernel components, memory cgroup uses some optimization to avoid unnecessary cacheline false sharing. usage_in_bytes is affected by the method and doesn't show 'exact' value of memory (and swap) usage, it's a fuzz value for efficient access. (Of course, when necessary, it's synchronized.) If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP) value in memory.stat(see 5.2).

关于docker - Rethinkdb容器:rethinkdb进程占用的RAM比整个容器少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33583407/

相关文章:

ruby-on-rails - 你的 `bin/bundle`不是Bundler生成的,所以这个binstub无法运行

amazon-web-services - 使用 ALB 对 redis 容器进行健康检查

centos - kubectl 从服务器获取 cs 提示错误(禁止)

go - 并行执行不同请求的正确方法

node.js - 匹配 RethinkDB 中给定数据数组的至少一个元素

rethinkdb - Changefeeds 功能在 RethinkDB 内部如何工作?

运行回显命令的 Docker 参数

angular - 开发 Angular 应用程序时应该使用 Docker 吗?

kubernetes - 无法从Kubernetes Pod访问dns

python - 为 JSON API 选择 RethinkDB 而不是传统 SQL 有多合适?