2011-02-08 4 views
4

私はどのファイルがページキャッシュにキャッシュされているか知りたいし、特定のファイルのキャッシュスペースを実用的に解放したいと思っています。カーネルモジュールを作成したり、必要に応じてカーネルコードを修正することも可能です。誰か私にいくつかの手がかりを与えることができますか?Linuxでページキャッシュを操作する方法は?

答えて

4

第1に、カーネルは、そのような情報の必要がないため、ページキャッシュ内のすべてのファイルのマスターリストを維持しません。代わりに、inodeを指定すると、関連するページキャッシュページを参照することができ、その逆も可能です。

各ページキャッシュstruct pageの場合、page_mapping()は、それが属するstruct address_spaceを返します。 hostのメンバーであるstruct address_spaceは、所有するstruct inodeを識別し、そこからiノード番号とデバイスを取得できます。

+0

感謝を解決します!次に、 'struct inode'のファイル名を取得する簡単な方法はありますか?複数のファイル名が同じiノードを指している場合は、いずれもOKです。 – stephenjy

+0

@Stephenjy:これはあなたが特定した理由によるものです。つまり、iノードにはゼロ、1つまたは複数のファイル名が付いている可能性があります。唯一の方法は、ファイルシステム内のすべてのファイル名を検索して一致するものを探すことです。あなたは簡単に他の方法に行くことができます - ファイル名を検索し、それが所有するページキャッシュページの数を決定します。 – caf

+0

私はすべての 'open()'システムコールを傍受し、開いているすべてのファイルを記録し、これらのファイルすべてをスキャンしてキャッシュされているかどうかを調べることができます。このようにして、私はファイルシステム全体をスキャンすることを取り除くことができます。それはできますか? – stephenjy

1

これはすぐに指定したファイルをキャッシュしたりしているページキャッシュの一部を取り除くことになるのLinux 2.6の時点であなたは

posix_fadvise(fd, POSIX_FADV_DONTNEED 

を使って、Linuxでページキャッシュからファイルの内容を解放することができますファイルの一部。操作が完了するまで呼び出しはブロックされますが、その動作はposixによって保証されません。

ページが変更されている場合は効果がないことに注意してください。その場合は、最初にfdatasyncなどを実行する必要があります。

編集:申し訳ありませんが、私はあなたの質問を完全に読んでいません。どのファイルを現在ページキャッシュに置いているかを知る方法はわかりません。ごめんなさい。

+1

おかげでたくさん、 'posix_fadvise()'私のもう一つの問題:)あなたのアドバイスのための – stephenjy

2

mincore()は、呼び出し元プロセスの仮想メモリのページがコア(RAM)に常駐しているかどうかを示すベクトルを返します。参照されるとディスクアクセス(ページフォールト)は発生しません。カーネルは、アドレスaddrで始まり長さバイトのページについての常駐情報を返します。

現在プロセスにマップされているファイルがキャッシュにあるかどうかをテストするには、マップされたアドレスのmincoreを呼び出します。
任意のファイルがキャッシュにあるかどうかをテストするには、そのファイルを開いてマップし、上記の手順に従います。

fincore()システムコールがありますが、最初にファイルをマッピングする必要はありませんが、(現時点では)まだ一般的には利用できません。それでも

(そしてmadvise(MADV_DONTNEED)/fadvise(FADV_DONTNEED)キャッシュからのマッピング/ファイルの一部を削除することができます。)

+0

'fincore()'をありがとう、これは私の別の問題を解決するのに役立ちます。ちなみに、 'fincore()'はシステムコールではありませんが、[linux-ftools](http://code.google。'POSIX_FADV_DONTNEED'を指定して' posix_fadvise() 'を使ってファイルのページを削除するには' mmap() 'と' mincore() 'を使います。キャッシュからのマッピング/ファイル。 – stephenjy

+0

@stephenjy:すでに述べたように、複数の既存のシステムコールを使用してその結果がユーザランドで得られたとしても、提案された 'fincore'システムコールがあります。 'linux-ftools'のように見えます。 – ephemient

関連する問題