dockerがすぐ落ちる error Command failed with signal SIGKILL.への対応(WSL2版)
概要
dockerを使用していると、レスポンスが極端に悪くなって、最終的にコンテナが落ちてしまう事象に遭遇。
下記コマンドでエラーを調査すると、
docker-compose logs [コンテナにつけた名前]
下記のようなエラーが発生している。
error Command failed with signal "SIGKILL".
これは、dockerに割り当てられたメモリが足りなくなった場合に起こるようです。
なお、WSL2のLinux側でfree -h
コマンドでメモリ使用量を確認すると、
メモリMem:
もスワップSwap:
もほぼ100%使い切り、タスクマネージャで確認すると、
メモリが100%近い状態で、CPU
もディスク
も負荷がかかっている状態になります。
対応1 割り当てるメモリを増やす
対応方法は、WindowsでWSL2を使用している場合と、MacやLinux系で直接dockerを動かしている場合で変わってきます。直接dockerを動かしている場合は、Docker Desktop
側で設定しますが、WSL2の場合は、設定しようとすると、You are using the WSL 2 backend, so resource limits are managed by Windows.You can configure limits on the memory, CPU, and swap size allocated to WSL 2 in a .wslconfig file.
と表示されていて設定ができません。WSL2側の設定に依存する動きにになるので、.wslconfig
ファイルを編集します。
直接dockerを動かしている場合
-
Docker Desktop
を起動します。 -
Settings
-Resources
を開きます。 -
Memory
を引き上げます。
WSL2でdockerを動かしている場合
次のファイルを更新します。ファイルがない場合は、作成します。
C:\Users\[ユーザ名]\.wslconfig
下記のように、メモリとCPUプロセッサの使用量を設定します。
[wsl2]
memory=3GB
processors=2
swap
パラメータを使い、スワップとして割り当てる要領をGB単位で設定することもできます。
スワップが発生すると、ディスクアクセスが大量に発生するので、スワップを使用しないように(0に)設定したほうが良いという説もあるようです。(ディスクアクセス大量発生やCPUが上がってしまったりは防げそうです)
[wsl2]
memory=3GB
processors=2
swap=0
設定したらPCを再起動するか、WSL2を再起動します。
ちなみに、コンテナごとに使用するメモリを制限したい場合、docker-compose.yml
で、コンテナごとに、mem_limit
を設定することで制限ができます。
※mem_limit: 1g
、mem_limit: 500m
のような形で指定します。
対応2 WSLを再起動する
あくまで暫定定期な対応になりますが、WSL2を再起動することで、仮想マシンのメモリ上のファイルキャッシュ等をクリアすることができます。
動作しているLinuxディストリビューションを確認する
wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
docker-desktop-data
docker-desktop
WSLを再起動する
wsl -t Ubuntu-20.04
※すべてのコンテナを停止してから行うようにします。
所感
WSL2やDockerを動かしていると、2-3GBはそちらにもっていかれるので、PCのメモリが8GBとかだと、少し心もとなくなりそうですね。16GBはあったほうがよさそうです。
Discussion