Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】OOMKill in Kubernetes and Linux (Exit Code 137)

2025年09月22日に「Dev.to」が公開したITニュース「OOMKill in Kubernetes and Linux (Exit Code 137)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

メモリ不足でプロセスが強制終了されることをOOMKillと呼ぶ。Kubernetesでは、コンテナがメモリ制限を超えるとLinuxカーネルのOOM Killerがプロセスを終了させ、終了コード137を出す。これはトラブルシューティングの重要な手がかりとなる。

ITニュース解説

システムを運用していると、時にアプリケーションが突然停止することがある。その原因の一つに、「OOMKill」と呼ばれる現象が存在する。これは、コンピュータのメモリが不足した際に、オペレーティングシステムが自動的に特定のプロセスを強制終了させる仕組みを指す。特に、コンテナ技術であるKubernetesを利用している環境では、このOOMKillは「Exit Code 137」として記録され、トラブルシューティングを行う上で非常に重要なシグナルとなるため、システムエンジニアを目指す上でその仕組みと発生理由を理解することは、安定したシステム構築と運用に不可欠である。

OOMKillが具体的にどのような状況で発生するかを解説する。Linuxのような多くのオペレーティングシステムは、メモリ管理において「オーバーコミットメント」というポリシーを採用している。これは、実際にシステムに搭載されている物理メモリの量よりも、アプリケーションが要求するメモリの合計量が一時的に多くなることを許容するという考え方である。例えば、物理メモリが8GBのシステムでも、複数のアプリケーションがそれぞれ5GBのメモリを要求したとしても、すぐにエラーにはならない。これは、アプリケーションが要求したメモリすべてを常に使用するわけではないため、一時的に多くのメモリ要求を許可しても問題ないと判断されるからである。しかし、実際にアプリケーションが要求したメモリを使い始め、その合計がシステムの物理メモリ容量を超過した場合、システムは深刻なメモリ不足に陥る。このような状況でシステム全体の安定性を保つため、Linuxカーネルは「OOM Killer」と呼ばれる特別なメカニズムを発動させる。

OOM Killerは、どのプロセスを終了させるかを慎重に判断する。その判断基準となるのが「OOMスコア」である。各プロセスにはOOMスコアが付けられており、このスコアが高いプロセスほど、OOM Killerによって終了させられる可能性が高くなる。このスコアは、プロセスのメモリ使用量、実行時間、root権限の有無など、いくつかの要因に基づいて算出される。OOM Killerは、このスコアを基に、最も適切だと判断されたプロセスを強制終了させ、メモリを解放することでシステムの完全な機能停止を防ごうとするのである。

Kubernetesの環境では、このOOMKillが特に重要な意味を持つ。Kubernetesでは、アプリケーションをコンテナとして動作させ、それぞれのコンテナにはCPUやメモリなどのリソース制限を設定することが可能である。例えば、あるコンテナに「メモリは2GBまで」という制限を設定したとする。もしそのコンテナが、何らかの理由で2GBを超えるメモリを消費しようとした場合、KubernetesはLinuxカーネルと連携し、そのコンテナをOOMKilledとしてマークする。そして、LinuxのOOM Killerがそのコンテナ内のメインプロセスを終了させ、結果としてコンテナは終了コード137を伴って停止する。この「OOMKilled」という状態と「Exit Code 137」は、コンテナが設定されたメモリ制限を超過したために強制終了されたことを明確に示しており、これはトラブルシューティングにおける貴重な情報源となる。

終了コードについてもう少し詳しく見てみよう。プログラムやスクリプトが終了する際には、必ず「終了コード(Exit Code)」という数値を出力する。この終了コードは、そのプログラムが正常に終了したのか、それとも何らかのエラーが発生したのかを示すシグナルである。一般的に、終了コード0は成功を意味し、それ以外の数値はエラーや異常終了を示す。しかし、終了コードの中には、特定の意味を持つ予約済みのものも存在する。例えば、終了コード127は「コマンドが見つからない」ことを意味することが多い。したがって、もしシステムエンジニアがユーザー定義のエラーコードとして127を使用したとすると、実際のトラブルシューティング時に、それが「コマンドが見つからない」エラーなのか、それともユーザーが意図した別のエラーなのかが判別できなくなり、混乱を招く可能性がある。

終了コード1~2、126~165、そして255は、システムが内部的に使用する、あるいは特定のシステムシグナルによってプロセスが終了したことを示す特別な意味を持つことが多いため、ユーザーが独自のエラーコードとしてこれらを使用することは避けるべきである。終了コード137は、具体的には、システムシグナル9(SIGKILL)によってプロセスが終了したことを示す。OOM Killerがプロセスを終了させる際、一般的にこのSIGKILLシグナルを送るため、結果として終了コード137となるのである。このため、KubernetesのコンテナがExit Code 137で停止した場合、それは「OOM Killerによって強制終了された」という明確なメッセージとして解釈できる。

このようなOOMKillの発生は、アプリケーションのメモリリーク(メモリが適切に解放されずに徐々に消費されていく現象)や、コンテナに設定されたメモリ制限がアプリケーションの実際の必要量に対して不足していることを示唆している。そのため、Kubernetes環境でOOMKilledが頻繁に発生する場合、アプリケーションのコードを見直したり、コンテナに割り当てるメモリリソースを見直したりするなどの対策が必要になる。OOMKillは、単なるエラーではなく、システムの健全性やアプリケーションの設計に関する重要なヒントを与えてくれるものである。システムエンジニアにとって、このシグナルを正しく理解し、それに基づいて問題を解決する能力は、システムの安定稼働を実現するために不可欠なスキルとなる。

関連コンテンツ

関連IT用語

関連ITニュース