Как манипулировать кешем страниц в Linux? - PullRequest
4 голосов
/ 08 февраля 2011

Я хочу знать, какие файлы кэшируются в Page Cache, и хочу прагматически освободить место в кэше определенного файлаЯ могу написать модуль ядра или даже изменить код ядра, если это необходимо.Кто-нибудь может дать мне несколько подсказок?

Ответы [ 3 ]

4 голосов
/ 09 февраля 2011

Во-первых, ядро ​​не поддерживает основной список всех файлов в кэше страниц, потому что оно не нуждается в такой информации. Вместо этого, учитывая индекс, вы можете искать связанные страницы кэша страниц и наоборот.

Для каждого кэша страниц struct page, page_mapping() вернет struct address_space, к которому он принадлежит. Член host в struct address_space идентифицирует владельца struct inode, и оттуда вы можете получить номер инода и устройство.

2 голосов
/ 09 февраля 2011

mincore() возвращает вектор, который указывает, являются ли страницы виртуальной памяти вызывающего процесса резидентными в ядре (RAM), и поэтому не будет вызывать доступ к диску (ошибка страницы), если на него ссылаются. Ядро возвращает информацию о резидентности страниц, начинающихся с адреса addr и продолжающихся в байтах длины.

Чтобы проверить, находится ли файл, в настоящее время сопоставленный с вашим процессом, в кэше, вызовите mincore с его сопоставленным адресом.
Чтобы проверить, находится ли произвольный файл в кеше, откройте и сопоставьте его, затем выполните приведенные выше действия.

Предлагается системный вызов fincore(), для которого не требуется сначала отображать файл, но (на данный момент) он пока недоступен.

(А затем madvise(MADV_DONTNEED) / fadvise(FADV_DONTNEED) может удалить части отображения / файла из кэша.)

1 голос
/ 08 февраля 2011

Вы можете освободить содержимое файла из кэша страниц в Linux с помощью

posix_fadvise(fd, POSIX_FADV_DONTNEED

Начиная с Linux 2.6, это сразу избавит от частей кэша страниц, которые кэшируют данный файл.или часть файла;вызов блокируется до завершения операции, но это поведение не гарантируется posix.

Обратите внимание, что это не будет иметь никакого эффекта, если страницы были изменены, в этом случае вы хотите выполнить fdatasync илитакие как первый.

РЕДАКТИРОВАТЬ: Извините, я не полностью прочитал ваш вопрос.Я не знаю, как определить, какие файлы в данный момент находятся в кеше страницы.К сожалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...