質問: Linux (RHEL 7.2)上に16[GByte]のファイルシステムを構築しました。 このファイルシステムの内容をメモリに常駐させたいと考えております。 物理メモリはこのファイシステムの情報をすべて保持するだけの十分な容量があります。 当初考えていたのは、OS 起動時にファイルシステムに格納されているファイルを全て読み込み /dev/null に捨てると言う方法です。これにより、ファイルシステムの内容は、一旦はメモリ上にキャッシュとして読み込まれ、次回以降、物理ディスクにアクセスを行うことなくファイルの読みこみができます。 しかし、この方法ですと、他のファイルシステムの読み込みが行われた場合、そのファイルシステムの情報がメモリ上にキャッシュとして読み込ま、最初に格納された目的のファイルシステムの情報がキャッシュから追い出されてしまいます。 これを防ぎたいと考えておりますが、何か良い方法はございますでしょうか? 特定のファイルシステム「専用」に、メモリ上にキャッシュを確保できるれば良いのですが。 これ以外の方法として tmpfs を使用する方法も考えましたが、ファイルシステムに書き込まれた情報を不揮発性の記録媒体に退避する運用が煩雑になるのと、不意の電源断等の障害が発生した際の信頼性に影響が出るため、この案の採用は難しい状況です。 (追記) mmap()でファイルの内容をプロセスメモリにマッピングし、当該領域をスワップアウト禁止とする方法はありませんでしょうか? 最悪、このようなデーモンを作成し、常駐させることにより、バッファからの追い出しを防ぐことが出来るかと考えています。(検証は必要ですが、まずはできるかどうか) (追記1) mlock()が使えそうです。引き続き調査中。 (追記2) open(), mmap(), mlock()を使用したアプリを作って検証。 dd文で直接デバイスファイルの読み取りを行う分には効果あり。 しかしながら、デバイスファイル上に作成したファイルシステム上での読み取りでは効果なく、それぞれ別にキャッシュされる。(free, iostatコマンドで確認)。 なんでだろ・・・。
回答: 出来ました。デバイスファイルを直接open(), mmap(), mlock()するのではなく、1クッション置いたファイルシステムに対して実行するようにしました。以下。 1. 既存のファイルシステム上にメモリ常駐させたいファイルシステム用の通常ファイルを作成。 (ddコマンドで) 2. 作成した通常ファイルをファイルシステムとしてフォーマット (mkfsコマンドで) 3. 通常ファイルを指定してマウント (mountコマンドで) 4. 通常ファイルをopen(), mmap(), mlock()したまま起動し続けるアプリを実行。