個々のプロセスのブロック キャッシュをオフにするにはどうすればよいですか?

個々のプロセスのブロック キャッシュをオフにするにはどうすればよいですか?

ディスクバウンドのサービスが多数ある大規模なシステムがあります。ブロック キャッシュを使用すると、これらのサービスの動作が大幅に改善されます。

それに加えて、いくつかのバックアップ プロセスも実行されています。

ブロック キャッシュをどのように使用すべきかはわかっています。絶対に使用すべきではありません。

バックアップはブロックデバイスを別のブロックデバイスにコピーすることで行われます。bufferコマンド。キャッシュが必要になる可能性は実質的にゼロです。

しかし、バックアップを実行すると、通常のサービスが悪化します。ioniceあまり役に立ちません。問題は IO の優先順位ではなく、ブロック キャッシュが不要なデータで上書きされることです。

bufferブロック キャッシュをまったく使用しないようにこのコマンドを設定することはできますか?

必要であれば、lvm ボリュームを別のボリュームにコピーします。

答え1

私は見つけたnocacheタスクのためのツール。

一般的に、Linuxではそれは不可能です。そのようなオプションやフラグなどはなく、プロセス

しかしposix_fadvise(...)呼び出しは、連続した読み取り/書き込み操作が予想される場合に、ブロック/バッファ キャッシュ サブシステムに通知するために使用できます。POSIX_FADV_DONTNEED近い将来に再読み取りされないため、キャッシュしないようカーネルに「追加情報」を提供します。

nocacheposix_fadvise(...)環境変数によって挿入された共有ライブラリを通じて、すべての重要なファイル操作をインターセプトしますLD_PRELOAD

名前の通り、これは単なるアドバイスです。しかし、私の実験では、巨大なパフォーマンスの向上 (実質的に、エンド ユーザーにとって目に見えるパフォーマンスの低下なしに、他の重要なタスクをバックグラウンドでバックアップと並行して実行できます)。

答え2

のようなツールnocacheは実際にはない適切な解決策。引用するにはキャッシュなしのソース:

このツールとは何かない良い:

  • ページキャッシュの使用方法を制御する
    • GitHub で見つけたランダムなツールが Linux カーネルよりも優れていると思うのはなぜですか?
  • キャッシュスラッシングの防御
    • cgroups を使用して、プロセスが持つメモリの量を制限します。以下を参照するか、インターネットで検索してください。これは広く知られており、確実に機能し、このツールのようにパフォーマンスの低下や潜在的に危険な動作を引き起こすことはありません。

したがって、cgroups (より正確には、2023 年には可能な限り必ず cgroupsv2) を使用して、プロセスが使用できるキャッシュの量を制限します (したがって、プロセスが削除できるキャッシュの量も制限します)。

メモリ制限された cgroup でプロセスとその子プロセスを実行する方法

たとえば、バックアップを実行したいが、ページ キャッシュのスラッシングによってシステムの速度が低下しないようにしたい場合に、これを実行してください。

systemdを使用する場合

ディストリビューションが を使用している場合systemd、これは非常に簡単です。Systemd では、プロセス (およびそのサブプロセス) を「スコープ」 (cgroup) 内で実行でき、cgroup の制限に変換されるパラメーターを指定できます。

バックアップを実行するときは、次の操作を行います。

$ systemd-run --scope --property=MemoryLimit=500M -- backup command 

MemoryMaxv2の場合)

その結果、キャッシュ スペースは最大 500MiB まで制限されることになります。

前に:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.4G        1.3G        1.0G        3.7G        3.7G
Swap:          9.7G         23M        9.7G

実行中 (バフ/キャッシュが約 300MiB しか増加しないことに注意してください):

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.5G        1.0G        1.1G        4.0G        3.6G
Swap:          9.7G         23M        9.7G

これはどのように作動しますか?

systemd-cglssystemd が作成する cgroup を一覧表示するには、これを使用します。私のシステムでは、上記のコマンドは親グループrun-u467.scopeに というグループを作成しますsystem.slice。次のようにして、そのメモリ設定を調べることができます。

$ mount | grep cgroup | grep memory cgroup on
/sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec
latime,memory)

$ cat /sys/fs/cgroup/memory/system.slice/run-u467.scope/memory.limit_in_bytes
524288000

関連情報