📘

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