ディスクバウンドのサービスが多数ある大規模なシステムがあります。ブロック キャッシュを使用すると、これらのサービスの動作が大幅に改善されます。
それに加えて、いくつかのバックアップ プロセスも実行されています。
ブロック キャッシュをどのように使用すべきかはわかっています。絶対に使用すべきではありません。
バックアップはブロックデバイスを別のブロックデバイスにコピーすることで行われます。buffer
コマンド。キャッシュが必要になる可能性は実質的にゼロです。
しかし、バックアップを実行すると、通常のサービスが悪化します。ionice
あまり役に立ちません。問題は IO の優先順位ではなく、ブロック キャッシュが不要なデータで上書きされることです。
buffer
ブロック キャッシュをまったく使用しないようにこのコマンドを設定することはできますか?
必要であれば、lvm ボリュームを別のボリュームにコピーします。
答え1
私は見つけたnocache
タスクのためのツール。
一般的に、Linuxではそれは不可能です。そのようなオプションやフラグなどはなく、プロセス。
しかしposix_fadvise(...)
呼び出しは、連続した読み取り/書き込み操作が予想される場合に、ブロック/バッファ キャッシュ サブシステムに通知するために使用できます。POSIX_FADV_DONTNEED
近い将来に再読み取りされないため、キャッシュしないようカーネルに「追加情報」を提供します。
nocache
posix_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
(MemoryMax
v2の場合)
その結果、キャッシュ スペースは最大 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-cgls
systemd が作成する 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