【Linux】OOM(Out of Memory)関連の導入と処理方法について

OOM(Out of Memory)関連の導入と処理方法について

OOM (メモリ不足) メカニズムはカーネルの一部であり、過剰なメモリ消費に対処するために使用されます。メモリ消費量の多いプロセスを 1 つ以上選択し、それらを終了してメモリを解放するのは、OOM メカニズムの役割です。

Linux では、プロセスの OOM スコアによって、メモリ不足が発生した場合にプロセスが終了する可能性が最も高いことが判断されます。OOM スコアが高いプロセスは終了される可能性が高くなります。

プロセスの OOM スコアを直接変更しないでください。一般に、次の方法で OOM の動作に影響を与えることができます。

  1. システムレベルのメモリ制限を調整します (例: sysctl は vm.overcommit_memory 制限を調整します)
  2. メモリ使用量の調整 (例: アプリケーション コードでのメモリ管理、または調整可能なプロセスまたはコンテナ制限の使用)
  3. OOM スコアのグローバル設定を調整します (/proc/sys/vm/oom_score_adj 値を変更するなど、すべてのプロセスに影響します)。

いずれの場合も、OOM 設定は慎重に取り扱い、実際のニーズと一致していることを確認してください。

sysctl を使用して、Linux システムの vm.overcommit_memory 設定を調整できます。この設定は、Linux カーネルがメモリの過剰割り当てを処理する方法を制御します。

vm.overcommit_memory 制限を変更する

Linux で sysctl を使用して vm.overcommit_memory 設定を変更する手順は次のとおりです。

  1. 現在の vm.overcommit_memory 設定を確認します。ターミナルで次のコマンドを実行します。

    sysctl vm.overcommit_memory
    

    このコマンドを実行するために高い権限が必要な場合は、コマンドの先頭に sudo を追加します。

  2. 出力に基づいてメモリ設定を変更する必要があるかどうかを判断します。vm.overcommit_memory には、次の 3 つの値から選択できます。

    • 0: カーネルがプロセスのニーズを満たすのに十分な空きメモリがあるかどうかをチェックし、十分なメモリがない場合は、カーネルがプロセスを強制終了してメモリを解放することを示します。
    • 1: カーネルは、プロセスが要求するすべての仮想メモリを割り当てることを許可し、物理メモリが十分であるかどうかをチェックしないことを示します。物理メモリが少ない場合、使用可能なメモリがないためにプロセスがクラッシュする可能性があります。
    • 2: カーネルは、プロセスが要求するすべての仮想メモリを割り当てることを許可しますが、スワップ スペースと物理メモリが十分であることを確認することを示します。両方が不十分な場合、カーネルはプロセスを強制終了し、メモリを解放します。
  3. vm.overcommit_memory 設定を変更します。コマンド ラインに次のコマンドを入力し、目的の値 (0 ~ 2) を置き換えます。

    sudo sysctl vm.overcommit_memory=<value>
    

    たとえば、値を 2 に設定する場合は、次のコマンドを実行できます。

    sudo sysctl vm.overcommit_memory=2
    
  4. 変更した値を永続的に保存したい場合は、/etc/sysctl.conf ファイルに追加できます。ファイルの最後に次の行を追加します。

    vm.overcommit_memory = <value>
    

    希望の設定値(0~2)に置き換えてください。

注: OS バージョンとカーネル バージョンが、設定した値をサポートしているかどうかに注意してください。また、予期しない動作を避けるために、メモリ設定の変更は慎重に行ってください。

メモリ使用量を調整する

1. アプリケーション コードでメモリを管理する: アプリケーションは、手動でのメモリの解放、メモリ プールの使用、メモリの再利用など、いくつかの手法を使用してメモリを管理できます。これにより、アプリケーションがメモリの過剰な使用を回避できるため、OOM 問題が発生する可能性が低くなります。

2. 調整可能なプロセスまたはコンテナーの制限を使用する: 調整可能なプロセスまたはコンテナーの制限を使用して、プロセスまたはコンテナーが使用できるメモリの量を制限できます。これらの制限は必要に応じて調整でき、過剰なメモリ使用量や OOM の問題を回避するために使用できます。

3. ハードウェアのアップグレード: OOM の問題が頻繁に発生する場合は、メモリ容量を増やすなど、システム ハードウェアのアップグレードを検討できます。これにより、システムのメモリ容量が増加し、OOM 問題の発生が減少します。

OOM スコアのグローバル設定を調整する

OOM スコアは、Linux システム内のプロセスの優先度を決定するために使用される指標です。この値を変更することで、システム内のプロセスの優先度を調整できます。OOM スコアのグローバル設定を調整する手順は次のとおりです。

  1. /etc/sysctl.conf ファイルを開きます。
sudo vim /etc/sysctl.conf
  1. ファイルの最後に次の行を追加します。
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
vm.oom_kill_allocating_task = 0
  1. これら 3 つのパラメータの意味を説明します。
  • vm.overcommit_memory: システム メモリの十分性チェック メカニズムを示します。0 はシステムが必要に応じてメモリ使用量をチェックして削減することを意味し、1 はシステム メモリ (つまり仮想メモリ) の合計量を超えるメモリの割り当てをシステムが許可することを意味し、2 はすべてのメモリ要求が関係なく割り当てられることを意味します。スワップ領域が十分かどうか。
  • vm.overcommit_ratio: vm.overcommit_memory が有効な場合に、アプリケーション層に割り当てられる物理メモリと仮想メモリの比率を示します。デフォルト値は 50% であるため、値を 80% に調整すると、アプリケーション層により多くの物理メモリを与えることができます。
  • vm.oom_kill_allocating_task: システムで OOM (メモリ不足) が発生した場合に、メモリを割り当てているタスクを強制終了してメモリを解放するかどうかを示します。この値を 0 に設定すると、システムはメモリを割り当てているプロセスではなく、既存のプロセスを強制終了できます。
  1. ファイルを保存して終了し、システムを再起動します (または、次のコマンドを実行して設定を有効にします)。
sudo sysctl -p

こうすることで、システム内のすべてのプロセスが新しい設定に従って優先順位付けされ、メモリ使用量をより適切に管理できるようになります。システムの優先度の調整には一定のリスクが伴いますので、運用前に慎重に評価し、データをバックアップしてください。

oom_score_adj 値を一時的に変更する

たとえば、ssh プロセスの oom_score_adj 値を一時的に変更します。

cat /proc/1589/oom_score_adj
-1000
# 覆盖原值
echo 0 > /proc/1589/oom_score_adj

関係書類

パニックオンウーム

メモリが少ない場合の動作を制御するために使用されます。

/proc/sys/vm/panic_on_oom

  • 値 0: メモリが不足している場合、OOM キラーを開始します。

  • 値 1: メモリが不十分な場合、カーネル パニック (システムの再起動) がトリガーされ、OOM キラーもアクティブになる可能性があります。

  • 値は 2 です。メモリが不足している場合、カーネル パニックが強制的にトリガーされ、カーネルが GG クラッシュ (システムの再起動) されることを意味します。

oom_kill_allocating_task

OOM がトリガーされたときに最初に強制終了するプロセスを決定するために使用されます

/proc/sys/vm/oom_kill_allocating_task

  • 値 0: 最高スコアのプロセスを強制終了します。

  • 値が 0 でない場合: 現在メモリに適用されているプロセスが強制終了され、OOM がトリガーされます。

oom_score_adj

プロセス強制終了の優先順位を設定するためのインターフェイス

/proc/PID/oom_score_adj (ポイントが小さいほど、強制終了される可能性が低くなります。値は -1000 ~ +1000 です)

oom_dump_tasks

OOM がトリガーされたときにどのログが記録されるかを記録するために使用されます

/proc/sys/vm/oom_dump_tasks oom_dump_tasks

パラメータには、プロセスの識別情報、プロセスが使用する仮想メモリの総量、物理メモリ、プロセスのページテーブル情報などを記録することができる。

値 0: 上記のログの出力をオフにします。大規模なシステムでは、数千のプロセスが存在する可能性があり、1 つずつ印刷するとメモリ情報が使用されるため、パフォーマンスの問題が発生する可能性があります。

その他の原因 OOM

その他 1: cgroup oom(/sys/fs/cgroup/memory)

1.memory.usage_in_bytes >memory.limit_in_bytesの場合にトリガーされます。

2.memory.oom_control は oom の動作を制御します

oom_kill_disable 1/0

3. ログの差分

Cgroup oom の場合、コールスタックには

a.mem_cgroup_out_of_memory+0xAAA/0xBBB

b. oom 情報には、used、limit、および現在の memcgroup 情報が追加されます。

タスク情報

その他 2: オーバーコミット

メモリ オーバーコミットとは、オペレーティング システムによってプロセスに約束されたメモリ サイズが、実際に利用可能なメモリを超えていることを意味します。

インターフェース:

/proc/sys/vm/overcommit_kbytes

/proc/sys/vm/overcommit_memory

カーネル パラメータ vm.overcommit_memory は、次の 3 つの値を受け入れます。

  • 0 – ヒューリスティックなオーバーコミット処理。これがデフォルト値です。オーバーコミットは許可されますが、あまりにも露骨なオーバーコミットは拒否されます。たとえば、malloc によって一度に要求されるメモリ サイズは、システム メモリの合計を超えます。ヒューリスティックとは「発見的」という意味です。カーネルは、特定のアルゴリズム (アルゴリズムの詳細な説明については記事の最後を参照) を使用して、メモリ アプリケーションが合理的かどうかを推測します。不合理であると判断した場合は、オーバーコミットを拒否します。

  • 1 – 常にオーバーコミット: オーバーコミットは許可され、メモリ要求は拒否されません。

  • 2 – Don’t overcommit. 禁止overcommit。

/proc/sys/vm/overcommit_ratio

デフォルトは 50 で、50% を超えるトリガーを意味します。

確認

# grep -i commit /proc/meminfo
CommitLimit: 5967744 kB
Committed_AS: 5363236 kB

知らせ:

オーバーコミットはメモリ アプリケーションを対象としています。メモリ アプリケーションはメモリ割り当てと同じではありません。メモリは実際に使用されるときにのみ割り当てられます。たとえば、プロセス malloc は 100G に適用されますが、10M のみが使用され、その後、oom は実際のメモリ (RSS) をターゲットにし、オーバーコミットは malloc をターゲットにします。

ログの違い: コールスタックには __vm_enough_memory がありますが、meminfo は出力されるだけであり、タスクは強制終了されません。

参考記事:https://zhuanlan.zhihu.com/p/463434212

おすすめ

転載: blog.csdn.net/imliuqun123/article/details/130890013