Выселение из кэша Linux

8

Глядя на то, как ведет себя кэш VFS на моей машине с Linux, я вижу, что даже когда фактически простаивает (crond и большинство других демонов остановлены, интерфейсы отключены), объем свободной памяти постепенно увеличивается, что подразумевает, что элементы удаляются из кэша.

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

symcbean
источник
«Подразумевая, что элементы выгружаются из кэша» - ну, в этом случае vmstatбудет наблюдаться увеличение размера кэша, - действительно ли они?
Пой
конечно уменьшается. Да, они (уменьшаются)
symcbean
Итак, вы говорите, что увеличение свободной памяти и размер кэша / буфера уменьшаются одновременно, верно?
Пойдж

Ответы:

1

Подкачка влияет только на то, будет ли выделена память приложения, чтобы освободить место для кэша. vfs_cache_pressure - это sysctl, который контролирует то, что вы видите.

Bratchley
источник
1
Нет - vfs_cache_pressure контролирует соотношение метаданных и срока хранения кэша страниц (по крайней мере, в соответствии с документами, которые я прочитал, и экспериментами, которые я провел)
symcbean
1
Справедливо. Я провел немного больше исследований, и из того, что я вижу, все упорядочено в списке заказов LRU, и я смотрел только тогда, когда какой-то порог (искусственный или физический) достигнут или превзойден. Учитывая это, я бы предположил, что что-то еще происходит (например, просыпается поток ядра или что-то в этом роде). Если вам очень важно это выяснить, похоже, что существует заранее написанный сценарий системной записи под названием "mmreclaim.stp", который отслеживает освобождения менеджера памяти. Я также удостоверился бы, что это на самом деле не поменяется местами с помощью «sar -A».
Братчли
1

Linux сбрасывает данные из кэша страниц, используя процесс, называемый pdflush

pdflush контролируется параметрами из / proc / sys / vm

#/proc/sys/vm/dirty_expire_centisecs
The hundredth of the second after which data will be considered to be expired from the page cache and will be written at the next opportunity.

#/proc/sys/vm/dirty_writeback_centisecs`    
The hundredth of a second after which the pdflush wakes up to write data to disk.

#/proc/sys/vm/vfs_cache_pressure`    
This will reclaim dentries and inodes which are also part of the cache.

Вы можете проверить следующие темы для получения дополнительной информации:

Демон pdflush
Теория работы и настройки для интенсивной записи
Linux Cache Memory

Джо
источник
Благодаря Джо, однако, первые 2 варианта относятся конкретно к данным, которые необходимо записать обратно в файловую систему (т. Е. В буфер записи), а не к данным, которые были прочитаны и не были изменены (буфер чтения). Vfs_cache_pressure управляет предпочтением удаления метаданных файла относительно содержимого файла.
Symcbean
@symcbean Вы правы. Ответ говорит больше о записи кэша. Кэш чтения очищается на основе LRU. Однако в Linux используется стратегия двух списков, в соответствии с которой очищается кэш чтения. Вы можете прочитать больше о Two-List Stragety и о том, как linux очищает кэш чтения здесь . Дайте мне знать, если это имеет смысл. В вашем случае я предполагаю, что после того, как все процессы остановлены, эти кэши чтения попадают в неактивный список и очищаются
Joe
спасибо, хорошая статья Есть идеи, из какой книги эта глава? Тем не менее, хотя он объясняет, как конкретная страница имеет приоритет для выселения, он на самом деле не объясняет, почему страницы выселяются, когда нет явного спроса на память. Что управляет процессом «для сокращения кэша, чтобы сделать доступным больше оперативной памяти для других целей»? Чем он заменяет?
Symcbean
@symcbean Вытеснение кеша работает сразу, когда есть потребность в памяти. Однако не имеет смысла хранить его в кеше, когда никто активно его не использует. Там активными страницами становятся неактивные страницы и в итоге их выселяют. Я предполагаю, что ваш вопрос возник из-за того, что выселение произойдет только тогда, когда есть спрос на память. Линукс будет очищать каждую неактивную страницу по мере их появления. Как отмечено в статье [ jothirams.com/linux-cached-memory/], если все активно, вам не хватит памяти и будет вызвана OOM.
Джо