すべてのLinux®ディストリビューションには、メモリ不足(OOM)キラープロセスが含まれていますが、それは何ですか?簡単に言えば、これはサーバーの自己保存プロセスです。それが何を意味するのかを完全に理解するには、Linuxがどのようにメモリを割り当てるかを検討してください。
Linuxのメモリ割り当て
Linuxカーネルは、サーバー上で現在実行されているすべてのアプリケーションにオンデマンドでメモリを割り当てます。これは通常、事前に行われるため、アプリケーションは通常、割り当てられたすべてのメモリを使用するわけではありません。これにより、カーネルがメモリをオーバーコミットできるようになり、メモリがより効率的になります。このオーバーコミットにより、カーネルは実際に物理的に利用可能なメモリよりも多くのメモリをコミットできます。通常、これは問題ではありません。この問題は、割り当てられたメモリを一度に使用し始めるアプリケーションが多すぎる場合に発生します。サーバーはメモリを使い果たしたため、クラッシュするリスクがあります。サーバーがそのクリティカルな状態に達するのを防ぐために、カーネルには OOM Killerと呼ばれるプロセスも含まれています。 。カーネルはこのプロセスを使用して、サーバーが動作し続けることができるように、必須ではないプロセスの強制終了を開始します。
これは問題ではないと思われるかもしれませんが、OOM Killerkillsは、サーバーがユーザーではなく、必須ではないと見なした処理を行います。たとえば、OOM Killerが通常最初に強制終了する2つのアプリケーションは、大量のメモリを使用するため、Apache®とMySQL®です。ウェブサイトを持っている人なら誰でも、それが大きな問題であることをすぐに知っています。 OOM Killerがこれらのいずれかを殺すと、Webサイトがすぐにクラッシュすることがよくあります。
特定のプロセスが強制終了されたのはなぜですか?
OOMキラーがアプリケーションまたはプロセスを強制終了した理由を調べようとすると、プロセスが強制終了された方法と理由を明らかにするのに役立ついくつかのことを探すことができます。最初に確認する場所は、 syslogです。 次のコマンドを実行します:
$ grep -i kill /var/log/messages*
host kernel: Out of Memory: Killed process 5123 (exampleprocess)
前の例と同様の出力が得られるはずです。首都K 殺された プロセスが-9
で強制終了されたことを通知します 信号であり、これは通常、OOMKillerが責任を負うことを示す良い指標です。
さらに、次のコマンドを実行して、サーバーのメモリの高低の統計を確認できます。
$ free -lh
-l </ code> スイッチは、高メモリ統計と低メモリ統計、および
-h
を表示します スイッチは出力をギガバイトに変換して、人間が読みやすくします。これを-m
に変更できます メガバイト単位の出力が必要な場合は切り替えます。このコマンドの追加の利点は、スワップメモリ使用量情報も提供することです。1つの注意点は、 free
コマンドはこの瞬間のスナップショットのみを提供するため、何が起こっているのかを知るために何度もチェックする必要があります。
幸い、 vmstat
コマンドは、一定期間にわたってメモリ出力を取得し、読みやすいテーブルのオプションもあります。
$ vmstat -SM 10 20
上記のコマンドは、システムメモリ情報を10秒間隔で20回出力します。これが、前の例の10と20の意味です。これらの数値の両方を変更して、ニーズに適した頻度と合計に合わせることができます。 -S
スイッチは出力を表形式で表示し、 -M
スイッチは出力をメガバイト単位で表示します。このコマンドを使用して、指定した時間パラメーター全体でアクティブに何が起こっているかを表示します。
使用するもう1つの優れたツールは、もちろん、 top
です。 指図。 top
デフォルトではCPU変数によって出力される順序ですが、 shift + Mをクリックすると top
を実行した後 コマンドを使用すると、CPU使用率の代わりにメモリ使用量のリアルタイム更新を取得できます。
OOMキラーを構成する
OOM Killerはプロセスであるため、ニーズに合わせて構成できます。実際、OOM Killerにはすでにいくつかの構成オプションが組み込まれており、サーバー管理者と開発者は、OOMKillerプロセスがメモリが危険なほど低い状況になっています。これらのオプションは、環境や実行中のアプリケーションなどの要因によって異なる可能性があることに注意してください。
構成の変更を伴うものと同様に、実際の本番環境で変更を行う前に、開発環境またはステージング環境で提案された変更をテストすることをお勧めします。このようにして、システムがこれらの変更にどのように反応するかがわかります。最後に、計画に自信がある場合でも、変更を加える前に必ずバックアップを作成してください。次の構成オプションでは、 root
である必要があります。 ユーザー。
オプション1:再起動
最初のオプションには、 sysctlの編集が含まれます 構成( /etc/sysctl.conf )、これにより、再起動間で変更を保持できます:
sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=X” >> /etc/sysctl.conf
X
上記のコマンドは、システムが再起動するまで待機する秒数です。
ほとんどの場合、システムのメモリが非常に少なくなるたびに再起動することはできません。このアプローチは状況によっては必要になる場合がありますが、ほとんどの場合、問題に対処するためにシステム全体を再起動する必要はなく、保証もされません。
オプション2:プロセスを保護または犠牲にする
この特定のオプションには、より洗練されたアプローチが必要です。 (a)OOM Killerによって強制終了される可能性を低くすることで特定のプロセスを保護するか、(b)特定のプロセスが強制終了される可能性が高くなるように設定することができます。これは、次のコマンドで実行できます。
echo -15 > /proc/(PID)/oom_adj (less likely)
echo 10 > /proc/(PID)/oom_adj (more likely)
(PID)
を置き換えます 関心のある特定のプロセスのID(またはPID)を含むサンプルコマンドのプレースホルダー。プロセスを保護または犠牲にするには、親プロセス(元のプロセス)を見つける必要があります。次のコマンドを使用して、プロセスをプロセス(Apache、MySQLなど)に置き換えるPPID(または親プロセスID)を見つけます。
pstree -p | grep "process" | head -1
このオプションは、システム全体を再起動するという核となるオプションよりも少し優れていることがわかります。ただし、重要で殺すことができないプロセスがある場合はどうなりますか?
オプション3:プロセスを免除する
このオプションには注意事項があります。プロセスを免除すると、状況によっては、システムとリソースの構成に大きく依存する意図しない動作の変更が発生する可能性があります。カーネルが大量のメモリを使用しているプロセスを強制終了できない場合、カーネルは他の使用可能なプロセスの強制終了を開始します。これには、重要なオペレーティングシステムプロセスでもある可能性のあるプロセスが含まれる場合があります。その結果、システムが完全にダウンする可能性があります。このオプションは細心の注意を払って使用してください。
OOM Killer調整の有効範囲は、 -16
の間であるため および+15
、 -17
の設定 プロセスがOOMKillerの調整スケールの許容可能な整数の範囲外であるため、プロセスを完全に免除します。一般的なルールは次のとおりです。数値が高いほど、プロセスが強制終了される可能性が高くなります。したがって、プロセスを完全に免除するコマンドは次のとおりです。
echo -17 > /proc/(PID)/oom_adj
オプション4:危険なオプション
警告 :Rackspaceは、実稼働環境ではこれを推奨していません。
再起動してプロセスを保護、犠牲、または免除するだけでは不十分な場合は、最後の危険なオプションがあります。OOMキラーを完全に無効にする オプション。
このオプションを使用すると、次のいずれかの結果が発生する可能性があります。
- 深刻なカーネルパニック
- システムのハングアップ
- システム全体のクラッシュ
なんで?サーバーがリソースを使い果たすのを防ぎます。OOMKillerを完全に無効にしても、サーバーのメモリ不足を防ぐものは何もありません。このオプションを検討するときは、極度の抑制と注意を払ってください。
このオプションを実行するには、次のコマンドを実行します。
sysctl vm.overcommit_memory=2
echo “vm.overcommit_memory=2” >> /etc/sysctl.conf
OOM Killerについて学習したので、個々の環境とシステムのニーズに合わせてプロセスを調整する方法を理解しました。一般的なルールとして、カーネルプロセスを編集するときは常に注意してください。 OOMKillerもそのルールの例外ではありません。