ECSで物理メモリに余裕があるのにOOM Killerによってプロセスが殺される件

AWSのECS(EC2タイプ)でバッチ処理が完了せずに終了している問題にぶつかりました。
システムログ(/var/log/messages)を確認したところ、以下の通り、OOM Killerによってプロセスが強制終了されていました。
物理メモリには全然余裕があるにも関わらず。
更に調べたところ、物理メモリの上限とは別に、cgroupによってメモリ上限が定められているらしく、こちらの上限に引っかかってプロセスが落とされているようでした。
本記事ではcgroupについて調べた結果を残しています。

kernel: Memory cgroup out of memory: Kill process 17642 (php) score 250 or sacrifice child
kernel: Killed process 17642 (php) total-vm:128900kB, anon-rss:101892kB, file-rss:12664kB, shmem-rss:0kB
kernel: oom_reaper: reaped process 17642 (php), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

cgroupとは

複数のプロセスをグループ化して管理できるもの。
CPUやメモリの利用量をグループ単位で制限できたりする。
ECSではサービス(タスク)毎にcgroupが作られる様です。

ちなみにcgroupはControl Groupの略らしい。

cgroupを確認する

systemd-cglsコマンドで確認できる。
ECSではecsというcgroupの配下にサービス毎に更にcgroupが作成されている。

ちなみにsystemd-cgtopコマンドでcgroup毎に各リソースの利用量が確認できる

cgroupのメモリの上限を確認する

cgroupのメモリ上限はmemory.limit_in_bytesというファイルに記載されているらしいので、試しに検索してみると、以下の様に表示された。
cgroup毎に設定ファイルが存在する事がわかる。

今回、問題になっているタスクのメモリ上限を確認すると約444MBになっていた

これはECSのタスク定義のコンソールから設定できる値と一致している。

cgroupのメモリ上限を変更する

ECSのタスク定義のコンソールから設定を変更する。

ECSクラスタのコンソールからタスクを再起動した後、cgroupの設定を確認すると変更されていた。
(タスクを再起動するとcgroupも再作成される点に注意)

コメントする