私はどのファイルがページキャッシュにキャッシュされているか知りたいし、特定のファイルのキャッシュスペースを実用的に解放したいと思っています。カーネルモジュールを作成したり、必要に応じてカーネルコードを修正することも可能です。誰か私にいくつかの手がかりを与えることができますか?Linuxでページキャッシュを操作する方法は?
答えて
第1に、カーネルは、そのような情報の必要がないため、ページキャッシュ内のすべてのファイルのマスターリストを維持しません。代わりに、inodeを指定すると、関連するページキャッシュページを参照することができ、その逆も可能です。
各ページキャッシュstruct page
の場合、page_mapping()
は、それが属するstruct address_space
を返します。 host
のメンバーであるstruct address_space
は、所有するstruct inode
を識別し、そこからiノード番号とデバイスを取得できます。
これはすぐに指定したファイルをキャッシュしたりしているページキャッシュの一部を取り除くことになるのLinux 2.6の時点であなたは
posix_fadvise(fd, POSIX_FADV_DONTNEED
を使って、Linuxでページキャッシュからファイルの内容を解放することができますファイルの一部。操作が完了するまで呼び出しはブロックされますが、その動作はposixによって保証されません。
ページが変更されている場合は効果がないことに注意してください。その場合は、最初にfdatasyncなどを実行する必要があります。
編集:申し訳ありませんが、私はあなたの質問を完全に読んでいません。どのファイルを現在ページキャッシュに置いているかを知る方法はわかりません。ごめんなさい。
おかげでたくさん、 'posix_fadvise()'私のもう一つの問題:)あなたのアドバイスのための – stephenjy
mincore()
は、呼び出し元プロセスの仮想メモリのページがコア(RAM)に常駐しているかどうかを示すベクトルを返します。参照されるとディスクアクセス(ページフォールト)は発生しません。カーネルは、アドレスaddrで始まり長さバイトのページについての常駐情報を返します。
現在プロセスにマップされているファイルがキャッシュにあるかどうかをテストするには、マップされたアドレスのmincore
を呼び出します。
任意のファイルがキャッシュにあるかどうかをテストするには、そのファイルを開いてマップし、上記の手順に従います。
fincore()
システムコールがありますが、最初にファイルをマッピングする必要はありませんが、(現時点では)まだ一般的には利用できません。それでも
(そしてmadvise(MADV_DONTNEED)
/fadvise(FADV_DONTNEED)
キャッシュからのマッピング/ファイルの一部を削除することができます。)
'fincore()'をありがとう、これは私の別の問題を解決するのに役立ちます。ちなみに、 'fincore()'はシステムコールではありませんが、[linux-ftools](http://code.google。'POSIX_FADV_DONTNEED'を指定して' posix_fadvise() 'を使ってファイルのページを削除するには' mmap() 'と' mincore() 'を使います。キャッシュからのマッピング/ファイル。 – stephenjy
@stephenjy:すでに述べたように、複数の既存のシステムコールを使用してその結果がユーザランドで得られたとしても、提案された 'fincore'システムコールがあります。 'linux-ftools'のように見えます。 – ephemient
- 1. プログラムでLinuxでページキャッシュを消去する方法
- 2. Linuxカーネルでページキャッシュを無効にするには?
- 3. Windows 10を使用してLinuxマシンでリモートファイルを操作する方法は?
- 4. CodeIgniterでページキャッシュがクリアされる方法
- 5. Doctrine:コレクションを操作する方法は?
- 6. CSVデータを操作する方法は?
- 7. ユーザースクロールを操作する方法は?
- 8. tempdbトランザクションログファイルを操作する方法は?
- 9. 高速バイナリ操作でMySQLでSETデータ型を操作する方法は?
- 10. Pythonでjsonオブジェクトのリストの操作でグループを操作する方法は?
- 11. Linux:ファイルを作成する方法は?
- 12. GitHubでフォークを操作する方法
- 13. jsでクッキーを操作する方法
- 14. レスポンスをhttpで操作する方法
- 15. Mootoolsでフォームを操作する方法
- 16. Perlでファイルポインタを操作する方法
- 17. Kotlinでマップを操作する方法
- 18. linuxでsettings.hexを作成する方法
- 19. Kotlinと文字列操作で文字列を操作する方法は?
- 20. Swiftでのビット操作の操作方法は?
- 21. WCF操作で非同期/バックグラウンドプロセスを作成する方法は?
- 22. パーシャルリンクの操作方法は?
- 23. マウスの操作方法は?
- 24. レコードの操作方法は?
- 25. タイムスタンプの操作方法は?
- 26. DispatchQueue.globalの操作方法は?
- 27. ramlの操作方法は?
- 28. dataTableの操作方法は?
- 29. Flutterでのスライドパネルの操作方法は?
- 30. Javaを使用してページキャッシュを削除する方法
感謝を解決します!次に、 'struct inode'のファイル名を取得する簡単な方法はありますか?複数のファイル名が同じiノードを指している場合は、いずれもOKです。 – stephenjy
@Stephenjy:これはあなたが特定した理由によるものです。つまり、iノードにはゼロ、1つまたは複数のファイル名が付いている可能性があります。唯一の方法は、ファイルシステム内のすべてのファイル名を検索して一致するものを探すことです。あなたは簡単に他の方法に行くことができます - ファイル名を検索し、それが所有するページキャッシュページの数を決定します。 – caf
私はすべての 'open()'システムコールを傍受し、開いているすべてのファイルを記録し、これらのファイルすべてをスキャンしてキャッシュされているかどうかを調べることができます。このようにして、私はファイルシステム全体をスキャンすることを取り除くことができます。それはできますか? – stephenjy