Подтвердить что ты не робот

Кэш страницы Linux - удаление страницы из кеша страницы в ядре

Мой вопрос является расширением этого Как манипулировать кешем страницы в Linux?

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

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

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

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

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

4b9b3361

Ответ 1

Я предлагаю ничего не менять, потому что алгоритмы кэширования LRU/MRU, поставляемые с ядром, очень эффективны. Гораздо больше, чем то, что вы можете настроить.

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

каждый кэш страницы struct page, page_mapping() будет возвращать struct address_space, принадлежащую хосту члена struct address_space, идентифицирует владелец struct inode, и оттуда вы можете получить номер и устройство inode.

Когда вы спрашиваете о программе, вы можете использовать cgroups:

Создайте cgroup с именем наподобие group1 с ограничением памяти (например, 50 ГБ, поддерживаются другие ограничения, например, CPU, например, также упоминается CPU):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Затем, если ваше приложение уже запущено, перенесите программу в эту группу:

cgclassify -g memory,cpu:group1 $(pidof your program)

Или выполните свою программу в этой группе:

cgexec -g memory,cpu:group1 your_app_name


Как очистить буфер/кеш страницы (дисковый кеш) под Linux

Что такое кэш памяти

Чтобы ускорить выполнение операций и уменьшить количество дисковых операций ввода/вывода, ядро обычно выполняет такое же кэширование

Как очистить кэш памяти с помощью /proc/sys/vm/drop_caches

1. Чтобы очистить только PageCache, запустите:

# sync; echo 1 > /proc/sys/vm/drop_caches

2. Чтобы очистить dentries (также называемый кешем каталогов) и выполнить inode:

# sync; echo 2 > /proc/sys/vm/drop_caches

3. Чтобы очистить PageCache, запустите dentries и inode:

# sync; echo 3 > /proc/sys/vm/drop_caches

Примечание: - Начиная с команды синхронизации, как показано в приведенных выше 3 командах, необязательно. Команда sync позволяет ядру записывать на диск как можно больше грязных страниц кэша (чтобы максимизировать количество страниц кэша данных, которые можно удалить)

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

dentry и inode_cache - это память, которая хранится после чтения атрибутов каталога/файла, таких как open() и stat(). dentry распространен во всех файловых системах, но inode_cache для каждой файловой системы. Ядро Linux предпочитает хранить эту информацию, предполагая, что она снова понадобится в ближайшем будущем, поэтому избегая дискового ввода-вывода.

Ответ 3

Я думаю, что вы боретесь с файловой системой.

  1. Если вы добавляете загружаемый модуль подсистемы кэширования Linux и система кэширования FS не знает об этом.

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

  2. cgroup - лучший модуль для расширения или кеш Linux. за то, что вы пытаетесь достичь.

Я не уверен, точная причина, но приведенная выше информация может помочь вам выяснить это.