dockerのmemoryオプションとswapの関係について
参考
tl;dr
- dockerはrun実行時に--memoryオプションを付けることで、コンテナが使えるメモリサイズに制限をかけることが出来ます。
- --memory-swapオプションでswapも変更できる。また、--memoryオプションだけ指定した場合、swapのサイズはmemoryサイズの2倍となります。
- out of memory(OOM)でエラーにならないように、--oom-kill-disableオプションがデフォルトで有効になっています。
dockerのmemoryオプションについて
公式のdocsにも書いてあるとおり、dockerではコンテナを作成する際にmemoryオプションを付けることで、コンテナが使用するメモリに制限をかけることが出来ます。
ちなみに、--memory-reservationというオプションもあって、こっちはホストのメモリに余裕がある場合は制限かけず、余裕が無い場合は制限をかけることが出来るようです。
実際に起動してみます。以下のような感じです。
$ sudo docker run -it --name test1 --memory=100M ubuntu /bin/bash
次にちゃんとメモリが制限されているかを確認します。 起動したコンテナ内で以下を実行。負荷が足りない場合は、&をつけて複数実行して下さい。
root@07c8d3ec8dca:/# /dev/null < $(yes)
ホスト側で確認してみると...
$ sudo docker stat CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 07c8d3ec8dca test1 46.68% 98.25MiB / 100MiB 98.25% 1.39kB / 0B 12.3MB / 7.08GB 4
見ていると、メモリが100Mを超えて使用されることはないので、確かに制限されていることがわかりますね。
memoryとswapの関係性
次に、--memory-swapオプションについて見ていきます。こちらもmemoryと同じように、コンテナが使用するswapサイズに制限をかけることが出来ます。
--memory-swappinessをつけることで無名スワップとの割り合いを変更出来るようです。
注意しておきたいのが、memoryオプションをつけてmemory-swapオプションつけなかった場合、swapのサイズはmemoryの"2倍"まで使用することが出来るようです。
If --memory-swap is unset, and --memory is set, the container can use twice as much swap as the --memory setting, if the host container has swap memory configured. For instance, if --memory="300m" and --memory-swap is not set, the container can use 300m of memory and 600m of swap.
実際に試したかったのですが、環境の問題で出来なかったのでまた今度にします。
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
gnu grubでswapの設定をすればいいみたいです。 Dockerコンテナのメモリ容量を制限する
よくわからないkernel-memory
kernel-memoryというオプションもあります。
Kernel memory limits are expressed in terms of the overall memory allocated to a container. Consider the following scenarios:
と公式のdocsに書いてあります。全てのコンテナに割り当てられたメモリの合計をkernel-memoryと読んでいる?
使い方はいまいち理解できていませんが、カーネルメモリを制限することで、起動している全てのコンテナのメモリ合計値が、ホストのメモリ量より大きくならないように制限をかけることが出来るようです。
つまり、複数コンテナを起動する場合、コンテナ1つ1つに制限をかけたとしても、その合計値がホストのメモリ量をオーバーしてしまったらまずいですが、とはいえコンテナ毎に管理するのは大変なので、コンテナ全体としての使用量を制限することでコンテナ毎に管理する手間を省くことが出来る。ということだと思います。
まとめ
dockerのmemoryオプションについて書きました。memoryの他にもcpuやデバイス単位での制限なんかもかけれるようです。別途機会があればまとめたいと思います。