単一プロセスに対してブロックキャッシュをオフにする方法は?

単一プロセスに対してブロックキャッシュをオフにする方法は?

私は多くのディスクバインディングサービスを備えた大規模なシステムを持っています。ブロックキャッシュを使用すると、よりうまく機能します。

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

私は彼らがどのようにブロックキャッシュを使用するべきかを知っています。絶対に使用しないでください。

バックアップは、あるブロックデバイスを別のブロックデバイスにコピーすることによって実行されます。buffer注文する。キャッシュが必要な可能性はほぼゼロです。

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

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

重要な場合は、lvm ボリュームを別のボリュームにコピーします。

答え1

見つけました。nocache作業のためのツール。

一般的に言えば、Linuxではこれは不可能です。プロセス

しかし、posix_fadvise(...)順次読み取り/書き込み操作が必要な場合は、呼び出しを使用してブロック/バッファキャッシュサブシステムに通知できます。 AはPOSIX_FADV_DONTNEEDカーネルに「追加情報」を提供しますが、近いうちに読み取られないのでキャッシュしないでください。

nocacheposix_fadvise(...)環境変数を介して注入された共有ライブラリを介してすべての重要なファイル操作をブロックしますLD_PRELOAD

名前が示すように、これは単なる提案ですが、私の実験ではわかります。巨大なパフォーマンスの向上(実際にエンドユーザーに目立つパフォーマンスを低下させることなく、他の重要なタスクをバックグラウンドバックアップと並行して実行できます)。

答え2

nocache実際、このようなツールはいいえ適切なソリューション。引用するキャッシュなし原産地:

このツールは何ですか?いいえ適切:

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

したがって、プロセスが使用できるキャッシュの量を制限するには、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.scopeparentというグループを作成します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

関連情報