Container OS にswapを設定する

Docker

Container OS 上でDocker Swarm を使ってサービスを運用していると、時々CPUの負荷が高まって応答が返って来なくなる状態になることがある。

sshでログインしてtopコマンドで原因を調べると、kswapd0というスレッドの負荷が高くなっている。スワップに関するカーネルのスレッドらしいのだけど、そもそもContainer OSにはスワップが有効にされていない。

Container OSはDockerに特化したOSであり、メモリ管理は各コンテナ内できっちり行えば、ホストOSがメモリ不足になるようなことは無い、ということなのかどうかは知らないけれど、とにかくContaner OSにはスワップが設定されていない。

この問題の困った点は、DockerのコンテナのCPUやメモリのリソースをきっちり制限して メモリに余裕を持たせた運用をしていても、 メモリ不足が原因と思われるkswapd0の高負荷問題が発生してしまうことだ。

再起動すれば解消するのだけど、その頻度を小さくしたい、できれば解消したいと思い、Container OSにswapを設定して様子を見ることにした。

設定方法は、Container OSの公式サイトに記載のとおりに行った。

まずは、スワップファイルを用意する。

$ mkdir -p /var/vm
$ fallocate -l 1024m /var/vm/swapfile1
$ chmod 600 /var/vm/swapfile1
$ mkswap /var/vm/swapfile1

次に、systemd ユニットファイルを記述していく。

$ vi /etc/systemd/system/var-vm-swapfile1.swap
[Unit]
Description=Turn on swap

[Swap]
What=/var/vm/swapfile1

[Install]
WantedBy=multi-user.target

準備はこれでOK。
次のコマンドでスワップの使用を開始する。

$ systemctl enable --now var-vm-swapfile1.swap

これで、スワップが利用可能になり、リブート時にも自動的に有効になる。

スワップがアクティブになっているか、swaponコマンドで確認できる。

$ swapon
NAME              TYPE  SIZE USED PRIO
/var/vm/swapfile1 file 1024M 268K   -2

OK。アクティブになってる。

さて、これで高負荷問題が解消するといいのだけど…

コメント

タイトルとURLをコピーしました