2015-05-02 2 views
19

Мой вопросом является продолжением этого одной How to manipulate page cache in Linux?Linux Page Cache - Удаление страницы из кэша страницы в ядре

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

  1. Поддержание очереди kfifo указателей страниц по мере их добавления в кэш страницы.
  2. Добавьте крючок в add_to_page_cache_lru() и посмотрите, больше ли размер дерева оснований (адрес_пространства) файла, чем предопределенный размер, а затем выберите жертву из очереди fifo и удалите страницу со страницы кэш.
  3. Я использовал функцию delete_from_page_cache() и try_to_unmap() выселять страницу из кэша страницы, а затем put_page(), чтобы освободить страницу.

Я ожидаю, что этот код освободит страницы и освободит память, но это, похоже, не происходит. Например, если я читаю файл размером 25 МБ, и я ограничил размер кеша страницы для этого файла размером 512 страниц (2 МБ), то я ожидаю увидеть изменение только 2 МБ в свободной памяти (free -m). Вместо этого я вижу, что полная 25 МБ съедена и появляется в свободной команде.

Что еще я должен сделать, чтобы убедиться, что мои требования будут выполнены? Я еще не думал о грязных страницах, поскольку я даже не мог заставить его работать для чтения (cat the file). Любые указатели были бы полезны.

P.S. - Я использую linux 4.0 для этого проекта.

+2

Об одном связанная с этим заметка, выполните проверку реализации «drop_caches» в ядре, то есть как она выполняет что-то подобное. http://stackoverflow.com/a/32288932/319204 – TheCodeArtist

+0

@ TheCodeArtist Спасибо! Я определенно дам эту попытку. – Singh

+0

Я подозреваю, что ОС может делать предположения о открытии файла и использует память самостоятельно, независимо от того, что вы просите, просто для повышения производительности доступа. Посмотрите, что он делает, не спрашивая какой-либо кеш (просто открыть файл) и проверьте свободную память. Затем попробуйте абсолютно массивный файл и посмотрите, насколько OS выделяет для кеша в этом случае. Это может быть ваш подходящий размер для работы. В противном случае вам может понадобиться создать собственное пространство кэша собственной памяти и скопировать в крошечный бит, который вы хотите кэшировать, а затем закрыть соединение с файлом. –

ответ

-2

Может быть, уставившись от освобождения (опорожнение) кэш поможет вашей отладки.

Чтобы получить ответ на вопрос заголовка, см https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system

, который говорит о следующей команды:

стремительные # эхо 3>/Труды/системы/VM/drop_caches

Смежные вопросы