📘

dockerがすぐ落ちる error Command failed with signal SIGKILL.への対応(WSL2版)

2022/02/12に公開

概要

docker を使用していると、レスポンスが極端に悪くなって、最終的にコンテナが落ちてしまう事象に遭遇。

下記コマンドでエラーを調査すると、

shell
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 を動かしている場合

  1. Docker Desktopを起動します。
  2. Settings-Resourcesを開きます。
  3. Memoryを引き上げます。

WSL2 で docker を動かしている場合
次のファイルを更新します。ファイルがない場合は、作成します。

C:\Users\[ユーザ名]\.wslconfig

下記のように、メモリと CPU プロセッサの使用量を設定します。

.wslconfig
[wsl2]
memory=3GB
processors=2

swapパラメータを使い、スワップとして割り当てる要領を GB 単位で設定することもできます。

スワップが発生すると、ディスクアクセスが大量に発生するので、スワップを使用しないように(0 に)設定したほうが良いという説もあるようです。(ディスクアクセス大量発生や CPU が上がってしまったりは防げそうです)

.wslconfig
[wsl2]
memory=3GB
processors=2
swap=0

設定したら PC を再起動するか、WSL2 を再起動します。

ちなみに、コンテナごとに使用するメモリを制限したい場合、docker-compose.ymlで、コンテナごとに、mem_limitを設定することで制限ができます。
 ※mem_limit: 1gmem_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