ディレクトリが常にキャッシュにあるように強制する

ディレクトリが常にキャッシュにあるように強制する

私はC++プロジェクト全体をコンパイルするのにかかる時間を減らすためにさまざまな方法をテストしてきました。現在は5分かかります。 distcc、ccacheなどを試しました。最近、プロジェクト全体をRAMドライブにコピーしてそこからコンパイルすると、コンパイル時間が元の時間の30%、わずか1.5分に短縮されることがわかりました。

明らかに、RAMドライブで作業することは非現実的です。では、どのような方法を使用できるかを知っている人はいますか?オペレーティングシステムが常にディレクトリをキャッシュするように強制する?私はまだディレクトリがいつものようにディスクに再同期したいのですが、常にデータのメモリ内コピーを望んでいます。可能ですか?

編集する: 考えられる解決策として、私たちはrsyncディスクドライブをRAMドライブと同期させるために10秒ごとに実行されるデーモンプロセスを開始することを考えました。その後、RAMドライブでコンパイルを実行します。非常に高速rsyncですが、実際に動作しますか?もちろん、OSが良いかもしれませんが..

答え1

キャッシュに多くのファイルを保持するための確実な方法は、そのファイルに頻繁にアクセスすることです。 Linuxはスワップとキャッシュの間で調整するのに非常に巧みなので、観察された速度の違いは実際にOSがキャッシュにエントリを保持しないためではなく、tmpfsの使用と他の試みの間の異なる違いによるものです。

各ケースでどのIOが実行されているかを見てください。基本的なツールは次のとおりです。iotop。他のツールも役に立ちます。LinuxディスクIO負荷分析(ファイルシステムパスおよび/またはプロセス別)?一定期間のI / Oを測定できるLinuxプログラムは何ですか?、サーバーエラーの他のスレッド。

何が起こるかについてのいくつかの仮定は次のとおりです。測定を行う場合は、これらの仮説を確認または反証できるようにこれを示してください。

  • ファイルがあれば面接時間一度開くと、オペレーティングシステムは、これらのアクセス時間を記録するのに多くの時間を無駄にすることができます。ビルドツリーへのアクセス時間は役に立たないので、必ずマウントオプションを使用してオフにしてくださいnoatime。あなたのtmpfs + rsyncソリューションは決してありません読むハードドライブに保存されているので、一度書き込むために余分な時間を費やす必要はありません。
  • 書かれた内容なら同期、コンパイラ呼び出しやsync()カーネルが出力バッファを頻繁にフラッシュするため、ハードディスクへの書き込みはtmpfsへの書き込みよりも時間がかかります。

答え2

Linux基本的にRAMをディスクキャッシュとして使用します。デモでtime find /some/dir/containing/a/lot/of/files > /dev/null2回実行してみてください。 2番目の実行は、すべてのディスクinodeがキャッシュされるため、はるかに高速です。ここでフォーカスは、このカーネル機能を活用し、それを交換しようとする試みを妨げる方法です。

ポイントは変更することですswappiness。メモリ使用量の3つの主な種類、アクティブプログラム、非アクティブプログラム、およびディスクキャッシュを考えてみましょう。明らかに、アクティブプログラムで使用されているメモリは交換しないでください。他の2つの間の選択はややランダムです。クイックプログラムの切り替えやクイックファイルアクセスをしたいですか? ㅏ低い交換性好むプログラムをメモリに保持(長期間使用しなくても)高い互換性好むより多くのディスクキャッシュを維持する(使用しないプログラムを交換して)(交換範囲は0〜100、デフォルトは60)

あなたの問題に対する私の解決策は、交換性を非常に高い値(100ではなく90-95)に変更してキャッシュをロードすることです。

echo 95 | sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null

お分かりのように、ヘッダーファイル、ライブラリ、IDE、および使用されている他のプログラムを含む、すべてのソースファイルとオブジェクトファイルとコンパイラをキャッシュするのに十分なメモリが必要です。

答え3

特定のファイルまたはすべてのファイルを特定のディレクトリのキャッシュに保存したい場合は、この方法がうまくいくようです。

仮想タッチそれがすることのようです。例5には必要なものがあります。

vmtouch -dl /whatever/directory/

rootとして実行する必要があります。sudo

答え4

inosyncRAMディスクに再同期したい場合は、このデーモンが好きなように聞こえます。 10秒ごとにrsyncの代わりに、Linuxのinotifyツールを使用してファイルが変更されたときにrsyncを実行します。 Debianリポジトリでそのパッケージが見つかりましたinosync。ソースコードは以下にあります。http://bb.xnull.de/projects/inosync/

関連情報