
【初心者向け】OOM-killerに怯えないための対策4選
2023.01.26
Linuxを利用している方で、メモリ枯渇によるプロセス停止=OOM-killerが発生して困ったことはありませんでしょうか。
本記事では、そんな方向けに発生原因から恒久的な対処について、分かりやすく紹介していきます。
はじめに
Linuxサーバーの運用にて大事なプロセスが勝手に落ちてしまって困った経験をした方は少なくないかと思います。原因の一つとしてOOM-killerというカーネル側の仕組みが影響していることがあります。
そこで今回は、OOM-killerという仕組みについて「なぜ起こるのか」、「起こった時何をしたらいいか」、「起こらないための対策」についてご紹介していきます。
Linux OOM-killerとは何なのか。そして起きる原因は。
そもそも物騒すぎるネーミングの「OOM-killer」とは何なのか。OOM-killerとは、OOM =(Out Of Memory)、つまりプロセスを実行するためのメモリが物理的に枯渇した場合、カーネルが強制的にプロセスを終了させメモリ確保を行う仕組みを指します。オーバーコミットしたプロセス云々。。。と込み入った話になるとイメージがしづらくなってくるので今回は
1. メモリ枯渇
2. カーネル「コストパフォーマンスの悪いこのプロセスを止めよう」
3. プロセス停止=OOM=killer
とイメージして頂ければ7割程度はお分かりいただけると思います。
OOM-killerが起きる原因として、メモリがピークアウトしてしまうような稼働をした時、カーネルはサーバー全体が動作停止してしまうことを防ぐために優先度などから判断してプロセスを停止させます。そうしてサーバーの安定稼働を保っているのです。はた迷惑だなと思うときもありますが致命的な障害から守ってくれる自浄装置だと考えると便利な機能だと思います。
そもそもメモリが枯渇してしまうような設計にしていることがよくないため、OOM-killerを憎むのはお門違い。設計を憎んで、OOM-killerを憎まず。
Linux OOM-killerが起きた時の対処
先ほど、設計を憎んでOOM-killerを憎まずと申しましたが、それでも大事なプロセスが止まると人は慌てふためきます。そんな時、どうしたらいいのでしょうか。
なんてことはありません。停止されたプロセスを再起動すればよいのです。ただ、そもそもメモリが高負荷であることが原因なので、まずはfreeコマンドやtopコマンド等でサーバーのキャパシティや動作状況を確認しましょう。
暴走しているプロセスなど原因がある場合、その対応を行って安定動作する確証が取れてから再起動など実施してみましょう。
時が解決してくれる時もありますので時間が許すのであれば、あわてず騒がず少し様子見してみるのもまたいいかもしれません。
サーバーへSSH接続できない時は諦めてサーバーの再起動を試みましょう。最終的にはこれしかありません。
そして発生・対処した時に、もうひとつやっておくべきことがあります。var/log/messagesの確認です。今回OOM-killerの記事なのでプロセス自動停止=OOM-killerで話を進めてきましたがそこにはプロセスがなぜ止まったか、何時止まったかがログとして出力されています。
同じ轍を踏まないよう、原因の対処のためにもvar/log/messagesの確認は行いましょう。

さらに可能であればダンプファイルを取得する仕組みを用意することで状況確認が容易になるかと思いますので、ご検討ください。
Linux OOM-killerを未然に防ぐ対策法について
原因が特定できたら次は対策し、同じようにOOM-Killerが発生することを未然に防ぎます。どういった状況下なのか、サーバーの構成・原因のプロセスによってで行える対策が変わってきますので、以下を例として原因に沿った対策を行います。
Swap設定をする
メモリが足りない→メモリ領域を拡張する。と短絡的に考えると有効な手段ではありますが、Swap領域を確保し一時的なピークアウトをしのげるだけの環境を用意することで防げるのであればそれに越したことはないですよね。
実際私が直面したOOM-killer問題の際にはSwap容量を新たに設定と、対象のサーバの役割が中継機能であるため役割を特化するように、Squidプロセスの「file descriptor」設定を調整したことによって鎮静化しました。
Swapの設定がされているか・容量は適正か、確認してみましょう。
優先度の設定をする
Killするプロセスの優先度を事前に設定することができます。
例えば、複数のプロセスが動いているサーバーにこのプロセスは、絶対に止まったら困るけど他のアレやコレは一時的に止まっても平気、などという環境には有効かと思います。
各プロセスのoom_score(優先度)を確認して調整してみましょう。
プロセスのチューニングをする
項目1でも簡単に記載していますが、起動しているプロセスのコンフィグを確認し現状の運用に適しているのか一度確認してみましょう。
HttpdやSquidなどは「file descriptor」の上限数と現状の接続数を比較して設定値が低そうならあげてみるなどの設定を行うことで、動作が安定する場合があります。
また、メモリリークが発生しているプロセスが無いか確認してみましょう。原因がリークの場合根本を絶たないと、時間とお金だけが奪われていくなんてことも起こりうるかもしれません。
メモリを拡張する
根本的に運用に適したメモリ容量じゃない場合があります。そんな時は、メモリを増やしましょう。ぜひ前述のコマンドなどで現状の稼働とメモリ状況を把握して、メモリの拡張を嘆願しましょう。最終的にはお金が解決してくれるかもしれません。
まとめ
今回はOOM-killerとは何かといった点から、原因・予防策について記載させて頂きました。詳しい対処法なども今後記事にさせて頂ければと思っています。この度はご閲読ありがとうございました。

【Google Cloud Next San Francisco ’23 現地レポート】BigQueryとPaLMによる次世代のデータ分析について

【Google Cloud Next San Francisco ’23 現地レポート】モダンアプリケーション開発のベストプラクティスについて

【Google Cloud Next San Francisco ’23 現地レポート】Google Kubernetes Engineを使用したエンタープライズアプリケーションの設計パターンについて

【Google Cloud Next San Francisco ’23 現地レポート】Google Cloudの暗号鍵について