状況
夜間バッチのコンテナが毎晩 10 分ほどで止まる。docker ps -a の STATUS は Exited (137)。誰も手で止めておらず、compose で mem_limit: 512m を設定している。先週から処理するデータ量が倍になった。
原因を調べる順番として、最も適切なものは?
- Adocker inspect で State.OOMKilled が true か
- Bdocker stats で、メモリ使用量が上限に近づくか
- Cアプリのログで、止まる直前に何を処理していたか
- D--no-cache でイメージを作り直して実行し直す
正答
- A → B → C → D
- C → D → A → B
- D → A → C → B
- B → D → C → A
解説
終了コード 137 は 128 + 9 で、プロセスが SIGKILL で強制終了されたことを示す。誰も止めていないうえ、メモリの上限があり、データ量が倍になったので、上限を超えて強制終了された可能性が最も高い。まず docker inspect の State.OOMKilled(A)で事実を確かめ、次に docker stats(B)で使用量が 512m に近づく様子を見る。SIGKILL は即座に止めるのでアプリのログに原因は出にくく、ログ(C)はどの処理で増えるかを絞る材料になる。イメージは変えていないので作り直し(D)は最後。対処は上限を上げるか、処理を分けて使用量を抑える。
参考: docs.docker.com
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ