
私は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プログラムは何ですか?、サーバーエラーの他のスレッド。
何が起こるかについてのいくつかの仮定は次のとおりです。測定を行う場合は、これらの仮説を確認または反証できるようにこれを示してください。
答え2
Linux基本的にRAMをディスクキャッシュとして使用します。デモでtime find /some/dir/containing/a/lot/of/files > /dev/null
2回実行してみてください。 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
inosync
RAMディスクに再同期したい場合は、このデーモンが好きなように聞こえます。 10秒ごとにrsyncの代わりに、Linuxのinotifyツールを使用してファイルが変更されたときにrsyncを実行します。 Debianリポジトリでそのパッケージが見つかりましたinosync
。ソースコードは以下にあります。http://bb.xnull.de/projects/inosync/。