私のLinuxシステムにもっと多くのメモリを追加した後、キャッシュをより積極的に使用したいと思います。
起こったことは次のとおりです。コンピュータを起動し、トイレに行って戻ってログインしました。ログインには約30分かかります。その後、Firefoxを起動すると時間がかかります。ログアウトしてから再度ログインすると、キャッシュが熱くなるため、これはすべて数秒で発生します。だから私はトイレにいるときにこれらのファイルをすべてキャッシュに保存するように自分のコンピュータを教えることができるかどうかを考えました。
プリロードを調べたところ、結果はやや残念です。最終的な理由は、mmap()されたファイルだけを追跡し、read()を介して読み取ったファイルは追跡しないためです。
私はこれがmmap()されたファイルが観察しやすいからだと思います。アプリケーションmmap()がファイルの場合、しばらくの間メモリに残り、open()-read()-close()は1秒以内に発生する可能性があります(間違っている場合は修正してください)。
ファイルを読むときに通知を受け取る簡単な方法はないようです。 inotifiyがありますが、ディレクトリを正しく登録する必要があり、IIRCが必要であり、ファイルシステム全体を監視するためのものではありません。
理想的には、いくつかのアプリケーションが読み取るファイル名を読み取ることができるデバイス(ttyのような)を/ devに持ちたいと思います。
(1)似たようなものがありますか?
(2) これが難しい理由はありますか?
ファイル読み取りアクセスに関する情報があれば、起動時にキャッシュを簡単にウォームアップできます。
答え1
read
システムコールキャッシュ情報:
システムread
コールは複数のソケットタイプに適用できます。したがって、キャッシュロジック自体はありませんread
。ただし、ファイルシステムでIO操作を実行している場合、ファイルシステム自体はキャッシュ技術をサポートできますが、これはファイルシステムによって異なります。
これは、大容量ファイルをメモリにマッピングし、そのファイルで機能するように特別に設計されているmmap
ためです。mmap
これを行う場合は、mmap
使用を検討する価値がありますread
。
記事の2番目の部分は、定義されたアプリケーションまたはプロセスで読み取られているファイルのリストを取得する方法を望んでいると述べました。
方法はわかりませんが、System Tapを使用すると、定義されたプロセスが/dev
実行されているすべてのパラメータまたはシステムコールをread
dmesgで印刷するカーネルモジュールを簡単に作成できます。open
その後、事前定義されたプレフィックスのようなものをこの出力に追加できます。これにより、dmesg | grep <prefix>
説明したように、そのカーネルモジュールのすべての出力を取得し、/dev
デバイスから希望の結果を得ることができます。
これは本番環境では使用しないでください。デバッグやその他の非本番目的でのみ使用してください。
これはSystem Tapの基本的なガイドです。これを学習したら、実行可能ファイル名またはプロセスPIDのみを入力として要求するSystem Tapスクリプトを生成できるはずです。その後、プロセスまたはアプリケーションのread
すべての呼び出し、またはシステム呼び出しのパラメータをopen
dmesgに印刷できます。