Container killed due to OOM (Out of Memory)
コンテナがメモリ不足で強制終了された場合のエラー
概要
DockerコンテナやKubernetes Podがメモリ制限を超過し、OOM Killer(Out of Memory Killer)によって強制終了された場合のエラーです。
エラーメッセージ
Container killed due to OOM
OOMKilled: true
Reason: OOMKilled
Exit code: 137
kubectl describe pod:
State: Terminated
Reason: OOMKilled
Exit Code: 137
原因
- メモリリーク: アプリケーションのメモリリーク
- メモリ制限が低すぎる: 設定した制限がアプリに不十分
- 急激なメモリ使用: 一時的な大量データ処理
- JVMヒープ設定: JavaアプリのヒープサイズとContainer制限の不整合
- キャッシュの肥大化: インメモリキャッシュの無制限増加
解決策
1. Dockerでメモリ制限を増やす
| |
2. Kubernetesでリソース設定
| |
3. JVMのメモリ設定
| |
| |
4. Node.jsのメモリ設定
| |
| |
5. メモリ使用量の監視
| |
6. メモリリークの検出(Node.js)
| |
7. メモリリークの検出(Python)
| |
8. Vertical Pod Autoscaler(VPA)
| |
9. Horizontal Pod Autoscaler(HPA)
| |
10. プロセスの優先度設定
| |
11. スワップの無効化確認
| |
診断フロー
kubectl describe podまたはdocker inspectでOOMKilledを確認kubectl top podまたはdocker statsでメモリ使用量を確認- アプリケーションログでメモリ関連のエラーを確認
- プロファイラーでメモリリークを調査
- リソース制限を調整
よくある間違い
- JVMのヒープサイズとコンテナ制限を同じにする(ネイティブメモリも必要)
- requestsとlimitsを同じにしない(QoS Classに影響)
- メモリリークを制限増加で対処しようとする
- 開発環境の設定を本番にそのまま使う
関連エラー
参考リンク
Docker の他のエラー
この記事は役に立ちましたか?