2015-11-07 52 views
1

我跑我的rethinkdb容器Kubernetes集羣較少的內存。下面是我注意到:Rethinkdb容器: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過程本身需要更多的內存嗎?

我跑碼頭工人V1.7.1,CoreOS v773.1.0,內核4.1.5

回答

2

top命令,你正在尋找物理內存數量。在stats命令中,這還包括磁盤緩存ram,因此它總是大於ram的物理量。當你真的需要更多的RAM時,緩存的磁盤將被釋放以供應用程序使用。

事實上,通過cgroup memory.usage_in_bytes提取了存儲器的使用情況,您可以在/sys/fs/cgroup/memory/docker/long_container_id/memory.usage_in_bytes中訪問它。而acording到Linux DOC https://www.kernel.org/doc/Documentation/cgroups/memory.txt 5.5節:

5.5 usage_in_bytes

爲了提高效率,如其他內核組件,內存cgroup中使用了一些 優化,以避免不必要的緩存行的錯誤共享。 usage_in_bytes由該方法的影響,不顯示「精確」的存儲器(和交換)的用法 值,它是有效的 訪問的模糊值。 (當然,在必要的時候,它是同步的。)如果你想知道 更精確的內存使用情況,你應該在 memory.stat(見5.2)使用RSS + CACHE(+ SWAP)值。

+0

但我不使用掉,我雙重檢查的'自由-m',使用總量爲約7.7/8 GB。所以我確定容器正在吃物理內存,而rethinkdb只使用它。請注意,該機器中沒有其他容器正在運行。 –

+0

你'免費-m'沒有說,你有' -/+緩衝區/緩存:4132'所以4132是用於緩衝區/高速緩存。磁盤緩存不是交換,我的意思是內核用來從磁盤緩存數據的內存量,你可以在這裏閱讀更多關於它的信息http://www.linuxatemyram.com/ – kureikain