squashfsデュアルキャッシュの問題

squashfsデュアルキャッシュの問題

ファイルに大きなsquashfsイメージがあるとします。したがって、ループバックデバイスとしてインストールされます。今私が理解しているように、カーネル4.4以降では、ループバックデバイスからデュアルキャッシングが削除されました。しかし、残念ながらsquashfsではそうではありません。

マウントされたsquashfsから何かを読み取ると、Linuxはイメージの圧縮部分を読み取ってキャッシュします。アクセスする解凍されたデータもキャッシュされるため、データの再読み込みが非常に速く、再解凍する必要はありません。

2番目のキャッシュは高速アクセスを提供するので、非常に良いです。最初のキャッシュはほとんど重複し、完全に役に立たない。 RAM使用量を汚染し、他のキャッシュエントリを削除する(または強制的にアプリケーションをスワップ)。実際に役に立つ。これは基本的にデュアルキャッシュの問題です。

ファイルがキャッシュされ、解凍される限り、ファイルのキャッシュされたバージョンを維持する必要はありません。データ圧縮

カーネルが後でこれらのキャッシュを削除する必要がある場合は、最初に圧縮されたデータキャッシュ(最近使用されていない)を削除してから解凍したデータを削除します。ドライブから再度読み取る必要があるため、読んだ後にこのことがわかります。そして再び解凍した。しかし、圧縮されたデータをドライブにキャッシュすることは意味がありません!

要約すると、次のようになります。

  • 高速アクセスのために解凍されたデータキャッシュ
  • 「圧縮された」squashfsデータ(ファイル)をまったく保存しないでください。

そのオプションを使用してインストールしようとしましたが、sync何もしませんでした。

パッチワークに近いソリューションがあります。デフォルトでは、次のコマンドはsquashfs圧縮データ(良好)のキャッシュを削除しますが、解凍されたデータ(良好)のキャッシュは削除しません。

dd if=root.squashfs iflag=nocache count=0

マウントポイントに触れません。これは、解凍されたデータが失われるためです(悪くなります)。代わりに、ループデバイスのデフォルトファイルをタッチします。そのファイルはキャッシュしたくないからです(言葉にならないからです)。

問題は、すべてのアプリケーションがいつでも読み取れるため、コマンドを引き続きポーリングする必要があることです。したがって、「kludge」は上記のコマンドが毎秒実行されるように設定しています。

明らかに、これはエレガントではなく、完全にハッキーです。しかし、少なくともそれは私が探しているものが何であるかを正確に示しています。ファイル自体のファイルキャッシュのみを削除します(圧縮解除されたファイルは削除しません)。コマンドがミリ秒ごとに実行されると想像してください。これはまさに私が望むものですが、このようなポーリングはありません。もっと良い方法がありますか?

関連情報