ページキャッシュ制限機能は、ビジネスのジッターや予期しないメモリ不足 (OOM) エラーなど、無制限のページキャッシュ使用によって引き起こされるシステムの不安定性の問題を解決するために、カーネルバージョン5.10.134-14
以降のAlibaba Cloud Linux 3で提供されています。
背景情報
カーネルでは、memcgで指定されたメモリの上限に達すると、メモリが割り当てられ、メモリ制御グループ (memcg) で直接メモリ再利用がトリガーされます。 メモリ再利用は、現在のプロセスのパフォーマンスに影響を与える可能性があります。 この問題を解決するために、memcg backend asynchronous relaim機能が提供されています。 しかし、この特徴は、バースト・メモリ要求に対してはあまり効果的ではない。 Sparkフレームワークなどの特定のジョブが実行されている場合、大量のメモリがページキャッシュとして使用されます。 ページキャッシュ内のほとんどのページはダーティページです。 汚れたページはゆっくりと回収されます。 その結果、カーネルは、動作を継続するのに十分なメモリを得ることができず、OOMエラーが予期せずに発生する。 ビジネスの安定性を確保し、予期しないOOMエラーを防ぐには、ページキャッシュの使用を制限する必要があります。
Alibaba Cloud Linux 3では、ページキャッシュ制限機能が提供され、ルートメモリを含むメモリのページキャッシュ使用量を制限します。 ページキャッシュの制限機能を使用して、ページキャッシュの使用量の制限を指定し、制限を超えた場合は、非同期的または同期的に過剰なページキャッシュを再利用できます。 これにより、予想以上のメモリ量がページキャッシュに使用されるのを防ぎ、システムの安定性と信頼性を向上させます。
インターフェイス
インターフェイス | 説明 |
/sys/kernel/mm/pagecache_limit/enabled | カーネルでページキャッシュ制限機能をグローバルに有効にするかどうかを制御するスイッチ。 有効な値: 0と1。 デフォルト値:0
|
/sys/fs/cgroup/memory/<Memcg directory name>/memory.pagecache_limit.enable | 特定のmemcgのページキャッシュ制限機能を有効にするかどうかを制御するスイッチ。 有効な値: 0と1。 デフォルト値:0
|
/sys/fs/cgroup/memory/<Memcg directory name>/memory.pagecache_limit.size | 特定のmemcgの最大ページキャッシュ使用率。 単位:バイト 有効な値: 0をmemcgに指定する
|
/sys/fs/cgroup/memory/<Memcg directory name>/memory.pagecache_limit.sync | memcgがページキャッシュ使用量の制限を超えた場合に、非同期または同期再利用を実行するかどうかを制御します。 有効な値: 0と1。 デフォルト値:0
|
機能の仕組み
ページキャッシュ制限機能を有効にすると、この機能は次の原則に基づいてmemcgsで機能します。
ページキャッシュがmemcgプロセスに割り当てられると、現在のmemcgがページキャッシュの使用制限を超えているかどうかを判断し、memcgから上方向に移動して親memcgの
memory.pagecache_limit
値を階層的にチェックします。 親memcgのmemory.pagecache_limit値が0の場合、親memcgのページキャッシュ制限機能は無効になります。 ページキャッシュの使用は、親memcgとその子memcgに制限されません。現在のmemcgがページキャッシュ使用量の制限を超えている場合、機能は
memory.pagecache_limit.sync
値に基づいて同期または非同期の再利用を実行するかどうかを決定します。この機能はページキャッシュを再利用します。
同期再利用: デフォルトでは、マップされていないファイルページのみを再利用できます。 カーネルが4回以上のスキャンを実行する場合、マッピングされたファイルページも再利用できます。
非同期再利用: デフォルトでは、マップされていないファイルページとマップされたファイルページを再利用できます。 カーネルが3回以上のスキャンを実行すると、ダーティページを再利用できます。
説明次のメモリページを使用できます。
マップされていないファイルページ: ファイルにマップされていないメモリページ。 ほとんどの場合、ページはメモリのプライベート領域であり、一時的なデータとプロセスを保持し、ディスクに永続化されません。
マップされたファイルページ: ファイルにマップされるメモリページ。 これらのページにより、プロセスはメモリ内のファイルデータを読み書きでき、ファイルへのランダムアクセスが可能になります。
ダーティページ: 変更されたマッピングされたファイルページ。 プロセスがマッピングされたファイルページにデータを書き込むと、ページはダーティとマークされます。 マークは、メモリ内のファイルコピーが変更され、ディスク上のファイルとは異なることを示します。 ダーティページは、データの永続性を確保するために定期的にディスクに書き戻されます。
インターフェイスの設定方法の例
この例では、20 MiBページキャッシュが作成され、ページキャッシュの使用量は10 MiBに制限されています。 ページキャッシュ制限機能を有効にした後、機能が期待どおりに機能するかどうかを確認します。
Elastic Compute Service (ECS) インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、ページキャッシュ制限機能をグローバルに有効にします。
sudo sh -c 'echo 1 > /sys/kernel/mm/pagecache_limit/enabled '
ページキャッシュ制限機能を有効にし、特定のmemcgのページキャッシュ使用量を制限します。
次のコマンドを実行してmemcgディレクトリを作成します。 例:
/sys/fs/cgroup/memory/test/
sudo mkdir -p /sys/fs/cgroup/memory/test/
次のコマンドを実行して、memcgのページキャッシュ使用量の制限を指定します。
この例では、memcgのページキャッシュ使用制限は10,485,760バイト (10 MiBにほぼ等しい) に設定されています。
sudo sh -c 'echo 10485760 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.size'
memcgのページキャッシュ再利用スキームを設定します。
非同期再利用スキームを使用するには、次のコマンドを実行します。
sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
同期再生スキームを使用するには、次のコマンドを実行します。
sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
次のコマンドを実行して、memcgのページキャッシュ制限機能を有効にします。
sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.enable'
ページキャッシュを作成します。
次のコマンドを実行して
libcgroup
パッケージをインストールします。ページキャッシュを作成するには、
cgexec
コマンドが必要です。 ほとんどの場合、cgexec
コマンドはlibcgroupパッケージの一部として提供され、インストールする必要があります。 システムでcgexec
コマンドが使用できない場合は、libcgroupパッケージをインストールします。sudo yum install libcgroup-tools
次のコマンドを実行してページキャッシュを作成します。
この例では、
dd
コマンドを使用して、1-MiBブロックを20回連続で書き込むことで、20-MiBページキャッシュを作成します。sudo dd if=/dev/zero of=./testfile bs=1M count=20 oflag=direct sudo cgexec -g "memory:test" cat. /testfile > /dev/null
ページキャッシュ制限機能が期待どおりに機能するかどうかを確認します。
次のコマンドを実行して、ページキャッシュの使用状況を確認します。
grep cache /sys/fs/cgroup/memory/test/memory.stat
次のコマンド出力が返されます。
上記のコマンド出力では、
cache
は、ページキャッシュの使用量が10,543,104バイト (約10 MiB) に制限されていることを示しています。次のコマンドを実行して、ページキャッシュ制限機能が期待どおりにページキャッシュを再利用するかどうかを確認します。
cat /sys/fs/cgroup/memory/test/memory.exstat
次のコマンド出力が返されます。
上記のコマンド出力で、
pagecache_limit_reclaimed_kb
は、10,108 KB (10 MiBにほぼ等しい) のページキャッシュが再利用されることを示します。検証結果は、20-MiBページキャッシュが作成され、ページキャッシュの使用量が10 MiBに制限されていることを示しています。 ページキャッシュの使用量が制限を超えると、ページキャッシュの10 MiBがページキャッシュ制限機能によって期待どおりに再利用されます。
説明pagecache_limit_reclaimed_kb
の値が予想よりも高い場合、これは、シーケンシャル読み取り操作中に先読みまたはプリフェッチされる不適切な量のデータが、ページキャッシュの過剰な再利用をもたらすためである可能性があります。echo 128 | sudo tee /sys/block/<Disk device name>/queue/read_ahead_kb
コマンドを実行して、ディスクのread_ahead_kbパラメーターを設定することを推奨します。 この例では、ディスクデバイス名としてvda
が使用されています。 read_ahead_kbパラメーターは、シーケンシャル読み取り操作中にカーネルが先読みまたはプリフェッチするキロバイト数を指定します。 次に、ページキャッシュ機能を再度確認します。