web-dev-qa-db-ja.com

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

私は、ファイルシステムに非常に大きな打撃を与え、一連の作業ファイルの読み取りと書き込みを行うプログラムを持っています。ファイルのサイズは数ギガバイトですが、RAMディスクに収まらないほど大きくはありません。このプログラムが実行されるマシンは通常、UbuntuLinuxボックスです。

非常に大きなキャッシュを持つようにファイルマネージャーを構成する方法はありますか?また、書き込みをキャッシュして後でディスクにヒットするようにする方法はありますか?

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

21
Will

デフォルトでは、Linuxは無料のRAM(ほぼすべて)を使用してディスクアクセスをキャッシュし、書き込みを遅らせます。カーネルがキャッシュ戦略を決定するために使用するヒューリスティックは完全ではありませんが、打ち負かしていますまた、ジャーナルファイルシステム(つまり、最近のすべてのデフォルトファイルシステム)では、ディスクへの実際の書き込みは、クラッシュに強い方法で実行されます。これは、少しのオーバーヘッドを意味します。ファイルシステムオプションをいじってみてください。たとえば、ext3の場合は、data=writebackまたはasyncでマウントしてみてください(これらのオプションはファイルシステムのパフォーマンスを向上させる可能性がありますが、クラッシュに対する回復力が低下します) 。また、noatimeを使用して、ファイルシステムのアクティビティを減らします。

プログラム的には、メモリマッピング(mmapを使用)を介してディスクアクセスを実行することもできます。これは少し実践的ですが、データ管理と最適化についてより詳細に制御できます。

23
Thomas Pornin

ディスクが組み込みの書き込みキャッシュを使用しているかどうかを確認しましたか?それはかなりの違いを生むことができます。 Linuxでは、hdparmを使用して動作を切り替えることができます。

/sbin/hdparm -W 0 /dev/hda 0 Disable write caching
/sbin/hdparm -W 1 /dev/hda 1 Enable write caching

明らかに、書き込みキャッシュが有効になっている場合、システムが不潔にシャットダウンすると(停電など)、データが失われたり破損したりする可能性があります。

ソフトウェアに関しては、Linuxカーネルは2つの主要な数値を使用して書き込み動作をパラメーター化します。

/proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio

現代のデフォルトは、回避するために、より頻繁に書き込むことです 巨大な書き込みスパイク 。ニーズに合わせてこれらを調整してみてください。利用可能なパラメータの 優れた議論 とそれらを調整する方法を次に示します。

17
ire_and_curses

Ramdiskを作成し、物理パーティションでRAID-1を作成できます。 --write-mostlyおよび--write-behindオプションを見てください。これらを使用して、物理ディスクを読み取り対象外(書き込み専用)にしたり、未処理の書き込み操作の数を設定したりできます。

または、pdflushのドキュメントを参照してください。ここに良いページがあります: http://www.westnet.com/~gsmith/content/linux-pdflush.htm (これもire_and_cursesによってリンクされています)ireが述べたことを超えて、あなたはおそらくしたいと思うでしょうスワップよりもディスクキャッシュを優先するために、スワップピネスを最大100までクランクします。

ただし、すべてがどのように機能するかを学び、特定のアプリに合わせて調整することは価値があります。 Linuxはすでに一般的なケースに合わせて調整されており、特定の状況がどのように異なるかを知っているのはあなただけです。 :)

12
dannysauer

ここでの問題は、本当にどのくらいの耐久性が必要かということです。

通常、Linuxは、しばらくの間ファイルをキャッシュするために必要なだけのRAMを使用して、変更を書き戻します。これは通常あなたが望むものなので、クラッシュした場合にデータの一部を失いますが、あまり多くはありません。

もちろん、アプリケーションは(たとえば)fdatasync()およびfsync()を使用して強制的に書き戻すことができます。

パフォーマンスを向上させるために、たとえば耐久性を犠牲にするなど、fdatasyncを呼び出す頻度を減らすことができます。

1
MarkR