目次
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も再作成される点に注意)
Webエンジニアをやっています
UX/UIデザインからプログラミング、DB設計、SEO、インフラ構築など幅広く対応してます
PHP/PHPUnit/Laravel/Vue/Nuxt/Docker/Terraform
ご連絡はTwitterのDMまで。