コンテナのメモリ使用量の強調に関するこの素敵な投稿にリンクしています。一般的な LXC ではなく、Docker で動作するように少し変更した要約を次に示します。
メモリ制限のあるコンテナーを起動します。
$ sudo docker run -m 512M -it ubuntu /bin/bash
root# apt-get update && apt-get install -y build-essential
foo.c
以下を使用して、コンテナー内にファイル を作成します。
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int i;
for (i=0; i<65536; i++) {
char *q = malloc(65536);
printf ("Malloced: %ld\n", 65536*i);
}
sleep(9999999);
}
ファイルをコンパイルします。
gcc -o foo foo.c
新しいターミナルを開いて、コンテナーのメモリ使用量を監視します。
$ cd /sys/fs/cgroup/memory/lxc/{{containerID}}
$ while true; do echo -n "Mem Usage (mb): " && expr `cat memory.usage_in_bytes` / 1024 / 1024; echo -n "Mem+swap Usage (mb): " && expr `cat memory.limit_in_bytes` / 1024 / 1024; sleep 1; done
コンテナー内のメモリ消費を開始します
$ ./foo
コンテナが最大になるように注意してください。注: メモリが不足すると、malloc が失敗し始めますが、それ以外の場合、コンテナーは放置されます。通常、コンテナ内のソフトウェアは malloc の失敗によりクラッシュしますが、回復力のあるソフトウェアは引き続き動作します。
最後の注意: Docker の-m
フラグは、スワップと RAM を別々にカウントしません。使用する-m 512M
と、その 512 の一部が RAM ではなくスワップになります。RAM のみが必要な場合は、LXC オプションを直接使用する必要があります (つまり、libcontainer の代わりに LXC 実行ドライバーを使用して Docker を実行する必要があります)。
# Same as docker -m 512m
sudo docker run --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash
# Set total to equal maximum RAM (for example, don't use swap)
sudo docker run --lxc-conf="lxc.cgroup.memory.max_usage_in_bytes=512M" --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash
swap を合計の一部として使用する場合と使用しない場合には顕著な違いがあります。swap を使用すると、上記の foo プログラムはすぐに ~450 MB に達し、その後ゆっくりと残りを消費しますが、RAM のみを使用すると、すぐに 511 MB にジャンプします。スワップを使用すると、コンテナーに入るとすぐにコンテナーのメモリ消費量が最大 60 MB とマークされます。これは基本的に、スワップが「使用量」としてカウントされることです。スワップを使用しない場合、コンテナーに入ったときのメモリ使用量は 10 MB 未満です。