私は多くのディスクバインディングサービスを備えた大規模なシステムを持っています。ブロックキャッシュを使用すると、よりうまく機能します。
これに加えて、いくつかのバックアッププロセスが実行されています。
私は彼らがどのようにブロックキャッシュを使用するべきかを知っています。絶対に使用しないでください。
バックアップは、あるブロックデバイスを別のブロックデバイスにコピーすることによって実行されます。buffer
注文する。キャッシュが必要な可能性はほぼゼロです。
ただし、バックアップが実行中の場合、通常のサービスが低下します。低くするionice
あまり役に立ちません。問題は、IO優先順位ではなく、ブロックキャッシュを不要なデータで上書きすることです。
buffer
ブロックキャッシュをまったく使用しないように、このコマンドを何らかの方法で設定できますか?
重要な場合は、lvm ボリュームを別のボリュームにコピーします。
答え1
見つけました。nocache
作業のためのツール。
一般的に言えば、Linuxではこれは不可能です。プロセス。
しかし、posix_fadvise(...)
順次読み取り/書き込み操作が必要な場合は、呼び出しを使用してブロック/バッファキャッシュサブシステムに通知できます。 AはPOSIX_FADV_DONTNEED
カーネルに「追加情報」を提供しますが、近いうちに読み取られないのでキャッシュしないでください。
nocache
posix_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
( 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
parentというグループを作成します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