Alibaba Cloud Linux 2 はカーネルバージョン 4.19.91-18.al7 以降、Alibaba Cloud Linux 3 はカーネルバージョン 5.10.60-9.al8 以降で、メモリサブシステム (memcg) のメモリ不足 (OOM) 優先度ポリシー機能をサポートしています。本トピックでは、memcg OOM 優先度ポリシー機能のインターフェースについて説明し、設定例を提供します。
背景情報
既存のカーネルシステムでは、メモリプレッシャーが高い場合、カーネルは cgroup を走査し、最もメモリを消費している cgroup からメモリを回収します。回収に失敗した場合、カーネルはメモリ不足 (OOM) イベントをトリガーし、その cgroup 内のすべてのタスクを強制終了する可能性があります。これにより、cgroup で実行されているクリティカルなサービスに深刻な影響を及ぼす可能性があります。そのため、クリティカルなサービスを含む cgroup のメモリが回収されないように保護したり、これらの cgroup 内のタスクが OOM イベントを生き延びられるようにしたりすることが重要です。これにより、カーネルは他の cgroup をメモリ回収または OOM kill の対象として選択できます。
この問題を解決するため、Alibaba Cloud Linux には memcg メモリ不足 (OOM) 優先度設定機能が含まれています。OOM 操作時に、この機能は cgroup の優先度を判定し、低優先度の cgroup を操作対象として選択します。
memcg OOM 優先度インターフェースの機能
インターフェース | 説明 |
| memcg OOM 優先度ポリシー機能を有効にするかどうかを指定します。有効値は 0 と 1 です。この設定は子 cgroup に継承されません。デフォルト値は 0 です。
|
| 重要度が異なるビジネスをサポートするために memcg 優先度を設定します。優先度レベルは 13 段階あります。有効値の範囲は 0 から 12 です。値が大きいほど優先度が高くなります。この設定は子 cgroup に継承されません。デフォルト値は 0 です。
|
インターフェース設定例
この例では、6 つの cgroup 子ノード A、B、C、D、E、F を作成し、memory.use_priority_oom インターフェースを有効にし、memory.priority インターフェースを使用して OOM 優先度を設定する方法を説明します。
root
/ \
A B
/ \ / \
C D E F各レベルのインターフェース値は次のとおりです。
A:10
B:8
C:5
D:6
E:7
F:8
ECS インスタンスにリモート接続します。
詳細については、「Workbench を使用して Linux インスタンスに接続する」をご参照ください。
次のコマンドを実行して、2 つの cgroup ノード A と B を作成し、memcg OOM 優先度ポリシー機能を有効にします。
mkdir /sys/fs/cgroup/memory/A cd /sys/fs/cgroup/memory/A echo 1 >memory.use_priority_oom mkdir /sys/fs/cgroup/memory/B cd /sys/fs/cgroup/memory/B echo 1 >memory.use_priority_oom次のコマンドを実行して、ノード A の memcg OOM 優先度を 10 に、ノード B を 8 に設定します。
cd /sys/fs/cgroup/memory/A echo 10 > memory.priority cd /sys/fs/cgroup/memory/B echo 8 > memory.priority次のコマンドを実行して、ノード A の下に子ノード C と D を作成し、ノード B の下に子ノード E と F を作成し、memcg OOM 優先度ポリシー機能を有効にします。
mkdir /sys/fs/cgroup/memory/A/C cd /sys/fs/cgroup/memory/A/C echo 1 >memory.use_priority_oom mkdir /sys/fs/cgroup/memory/A/D cd /sys/fs/cgroup/memory/A/D echo 1 >memory.use_priority_oom mkdir /sys/fs/cgroup/memory/B/E cd /sys/fs/cgroup/memory/B/E echo 1 >memory.use_priority_oom mkdir /sys/fs/cgroup/memory/B/F cd /sys/fs/cgroup/memory/B/F echo 1 >memory.use_priority_oom次のコマンドを実行して、子ノード C、D、E、F の memcg OOM 優先度をそれぞれ 5、6、7、8 に設定します。
cd /sys/fs/cgroup/memory/A/C echo 5 > memory.priority cd /sys/fs/cgroup/memory/A/D echo 6 > memory.priority cd /sys/fs/cgroup/memory/B/E echo 7 > memory.priority cd /sys/fs/cgroup/memory/B/F echo 8 > memory.priority
root で OOM がトリガーされると、システムは A と B から反復クエリを開始します。B の優先度 (8) は A (10) よりも低いため、システムは B の配下にある E と F のクエリを続行します。E の優先度 (7) は F (8) よりも低いため、cgroup E が OOM 操作の対象として選択されます。