web-dev-qa-db-ja.com

ライトスルーRAMディスク、またはファイルシステムの大規模なキャッシュ?

私は、ファイルシステムに非常に大きな打撃を与え、一連の作業ファイルに対してランダムに読み取りと書き込みを行うプログラムを持っています。ファイルのサイズは合計で数ギガバイトですが、RAMを節約して、ほとんどすべてをメモリに保持できます。このプログラムが実行されるマシンは通常、UbuntuLinuxボックスです。

非常に大きなキャッシュを持つようにファイルシステムを構成する方法はありますか?また、書き込みをキャッシュして後でディスクにヒットするようにする方法はありますか?電力損失などの問題を理解しており、受け入れる用意があります。クラッシュはさておき、通常の操作では、書き込みは最終的にディスクに到達するはずです!

または、実際のディスクにライトスルーするRAMディスクを作成する方法はありますか?

7
Will

高速および緩いマウントオプションを使用してext4ファイルシステムを使用することを検討してください。

noatime,data=writeback,nobh,barrier=0,commit=300

キャッシュから物理ディスクへのデータの書き込みを延期します。

それ以外の場合は、aufsを使用して、通常のファイルシステムの上にtmpfsファイルシステムをユニオンマウントし、すべての書き込みを行ってから、tmpfsを実際のファイルシステムにマージして戻すことができます。

6
RolKau

多数のIO待機があり、既存のバッファーを介して読み取りおよび書き込み要求が満たされていないことを示していますか?他の人が指摘しているように、Linuxはスペアを提供するのに非常に優れていますRAMをバッファに保存するため、最初にこれを確認する必要があります。

IO待機が表示されない場合は、パフォーマンスの問題(問題がありますか?質問にはありません)が、多数の小さなプログラムからのカーネルコンテキストスイッチが原因である可能性があります。 -開始IO操作。この場合、メモリマップファイルを使用するようにアプリケーションを書き直すことで、パフォーマンスを大幅に向上させることができます。しかし、それはStackOverflowにとってより大きな問題です。

6
Anon

LinuxはデフォルトでスペアのRAMをファイルキャッシュとして使用するため、そのための構成は必要ありません。

ファイルシステムとして ext4 の使用を検討することをお勧めします。これは、ディスクアクセスを高速化するために、 遅延割り当て など、非常に多くの手法を使用しています。

これには、割り当てをまとめてより大きな実行にバッチ処理する効果があります。このような遅延処理により、CPU使用率が低下し、特に成長が遅いファイルの場合、ディスクの断片化が減少する傾向があります。また、同時に複数のファイルが増大している場合に、割り当てを連続して維持するのにも役立ちます。

journaling を使用しているため、データが失われることはほとんどありません。

Linuxの最近のリリースでは、Ext4がデフォルトのファイルシステムになりましたが、使用するカーネルが少なくとも2.6.30であることを確認する必要があります。

1
Hamish Downer

ここで私の答えを見ることができます: Reserve RAMキャッシュとバッファ用 。キャッシュとバッファ用にメモリを予約したい場合:echo 10>/proc/sys/vm/vfs_cache_pressure(100がデフォルト値の場合)次に、各アプリで使用される最大RAMを制限できます:echo 8192>/proc/sys/vm/max_map_count。

1
Gigamegs

これらのファイルでmmapを使用します。カーネルの優れたキャッシュを使用するため、はるかに高速になります。

1
gthomas

LinuxはあなたのRAM 非常に効率的に を使用します。
大きなファイルでキャッシュすることに本当に取り組む必要はないと思います。
これを自分でチェックするには、 これらのことを試してください

Linuxのディスクキャッシュは非常に目立たないものです。スペアメモリを使用して、アプリケーションからメモリを奪うことなく、ディスクアクセス速度を大幅に向上させます。

システムのRAM)の量と、スケールアップできるかどうかを確認してください。
この目的のためにRAMディスクは必要ありません。
ディスクキャッシュは、使用可能なすべてのRAMスペースで正常に機能します。

0
nik

RapidCache はRAMディスクにライトスルーを提供しますが、現在は「ベータ版」です。

0
Martin