Linux システムでメモリ回収によって低メモリ状態を解決できない場合、カーネルは OOM Killer を呼び出してプロセスを強制的に終了させます。このトピックでは、Alibaba Cloud Linux での OOM Killer イベントの一般的な原因とその解決方法について説明します。
現象
次のログは、test プロセスが OOM Killer をトリガーしたことを示しています:
565 [Sat Sep 11 12:24:42 2021] test invoked oom-killer: gfp_mask=0x62****(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0, oom_score_adj=0
566 [Sat Sep 11 12:24:42 2021] test cpuset=/ mems_allowed=0
567 [Sat Sep 11 12:24:42 2021] CPU: 1 PID: 29748 Comm: test Kdump: loaded Not tainted 4.19.91-24.1.al7.x86_64 #1
568 [Sat Sep 11 12:24:42 2021] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS e62**** 04/01/2014
考えられる原因
OOM Killer イベントは、グローバルメモリの不足または cgroup のメモリ不足が原因で発生します。次の表に、一般的なシナリオを示します:
|
原因 |
シナリオ例 |
|
cgroup のメモリ不足 |
このログでは、OOM Killer は
原因: |
|
親 cgroup のメモリ不足 |
ここでは、cgroup
原因: 親 cgroup |
|
グローバルメモリの不足 |
このログでは、
原因:空きメモリが最小しきい値を下回り、メモリ回収で十分なページを解放できませんでした。 |
|
メモリノードのメモリ不足 |
このログの主要な指標:
原因: NUMA アーキテクチャでは、 |
|
メモリの断片化によるバディシステムのメモリ不足 |
このログの主要な指標:
原因:メモリの断片化により、全体の空きメモリは十分であっても、バディシステムは要求されたサイズの連続ブロックを割り当てることができません。 説明
バディシステムは、断片化を軽減するためにさまざまなサイズの連続ブロックを管理する Linux カーネルのメモリアロケーターです。 |
ソリューション
原因に基づいて問題を解決します。
cgroup または親 cgroup のメモリ不足
不要なプロセスを終了してメモリを解放してください。ワークロードがより多くのメモリを必要とする場合は、インスタンスをアップグレードしてください。
-
インスタンスをアップグレードしてください。
詳細については、「設定変更の概要」をご参照ください。
-
アップグレード後、cgroup のメモリ制限を手動で調整してください。
sudo bash -c 'echo <value> > /sys/fs/cgroup/memory/<cgroup_name>/memory.limit_in_bytes'<value>をバイト単位の cgroup の新しいメモリ制限に、<cgroup_name>を cgroup の名前に置き換えます。
グローバルメモリの不足
次の領域を調査してください:
-
slab_unreclaimableメモリの使用状況を確認してください。cat /proc/meminfo | grep "SUnreclaim"slab_unreclaimableは、システムが回収できないメモリです。合計メモリの 10% を超える場合、slab メモリリークの可能性があります。トラブルシューティングについては、「インスタンスの slab_unreclaimable メモリの割合が高い場合の対処方法」をご参照ください。問題が解決しない場合は、チケットを送信してください。 -
systemdのメモリ使用状況を確認してください。cat /proc/1/status | grep "RssAnon"カーネルは OOM の強制終了中にプロセス 1 (
systemd) をスキップするため、systemdのメモリ使用量は 200 MB を超えないようにする必要があります。使用量が異常に多い場合は、systemdを新しいバージョンに更新してください。 -
透過的ヒュージページ (THP) のパフォーマンスを確認してください。
THP はメモリの肥大化を引き起こし、OOM イベントにつながる可能性があります。これを軽減するには、「Alibaba Cloud Linux で THP を使用してパフォーマンスをチューニングする方法」の説明に従って THP 設定をチューニングしてください。
メモリノードのメモリ不足
cgroup が追加のノードからメモリを使用できるように、cpuset.mems を再設定してください。
-
システム内のメモリノードを特定してください。
cat /proc/buddyinfo -
cpuset.memsパラメーターを設定してください。sudo bash -c 'echo <value> > /sys/fs/cgroup/cpuset/<cgroup_name>/cpuset.mems'<value>を対応するメモリノード番号に、<cgroup_name>を cgroup の名前に置き換えます。たとえば、システムに 3 つのノード (ノード 0、ノード 1、およびノード 2) があり、cgroup でノード 0 とノード 2 のメモリを使用する場合、
<value>を0,2に設定します。
メモリの断片化によるバディシステムのメモリ不足
オフピーク時にメモリコンパクションを実行してください:
sudo bash -c 'echo 1 > /proc/sys/vm/compact_memory'