Вопрос или проблема
Можно ли уменьшить объем, используемый для кеша radix_tree_node
в Linux, не уменьшая общий размер кеша?
Например, в настоящее время у меня есть
$ sudo slabtop -sc --once | awk '{ if (0 + $1 > 0) { printf "%20s: % 6d MB, active %3.0f%%\n", $8, $7 / 1024, (100*$2/$1); } }'
ext4_inode_cache: 10387 MB, active 100%
dentry: 2042 MB, active 100%
radix_tree_node: 263 MB, active 90%
buffer_head: 117 MB, active 100%
kmalloc-rcl-64: 92 MB, active 100%
kmalloc-rcl-96: 79 MB, active 100%
dmaengine-unmap-2: 43 MB, active 100%
vm_area_struct: 18 MB, active 99%
task_struct: 13 MB, active 98%
ext4_extent_status: 12 MB, active 100%
ext4_groupinfo_4k: 10 MB, active 100%
inode_cache: 10 MB, active 90%
kmalloc-4k: 7 MB, active 99%
kmalloc-rcl-128: 7 MB, active 100%
kernfs_node_cache: 5 MB, active 100%
proc_inode_cache: 5 MB, active 99%
Таким образом, все остальные кеши имеют не менее 98% активности, кроме radix_tree_node
, который имеет всего 90% активности. Эта система не тратит огромное количество памяти, но, похоже, что общая эффективность использования кеша была бы улучшена, если бы размер radix_tree_node
был уменьшен, чтобы избавиться от неактивных кешей. Когда я запускаю просто slabtop -sc
, я получаю USE 0%
для radix_tree_node
, но я предполагаю, что это просто некорректный учет.
Например, похоже, что мне нужно уменьшить /proc/sys/vm/vfs_cache_pressure
, потому что кеши dentry
составляют всего 20% от ext4_inode_cache
, оба имеют 100% активности. Для моей нагрузки система нуждается в стати многочисленных записей каталогов.
После экспериментов с этим я бы сказал, что вам следует использовать версию ядра Linux 5.4 или выше и затем при необходимости настроить /proc/sys/vm/vfs_cache_pressure
. Я бы попытался использовать как можно меньшую величину, которая всё еще не вызывает замедления для системы. По моему опыту, значения vfs_cache_pressure
в диапазоне 1–10 были хороши для версии ядра 5.3, но версия ядра 5.4 требует значений близких к 100 для достижения аналогичного поведения.
Низкое значение для vfs_cache_pressure
было бы полезно для сохранения большего количества метаданных каталогов в ОЗУ, так что когда процессы обращаются к файлам, носителю данных нужно только загрузить фактическое содержимое файла. Это особенно важно для HDD, которые медлительны при случайном доступе. И для носителя данных, получение метаданных для глубоких иерархий каталогов выглядит как случайный доступ к данным, потому что системе нужно читать каталоги на нескольких уровнях, и каждый каталог расположен в разных областях на самом носителе данных.
Однако, если вы слишком сильно уменьшите vfs_cache_pressure
, система может начать использовать своп вместо удаления метаданных каталогов из кеша, что, очевидно, также приведет к плохой производительности. Я думаю, что это единственное наиболее важное различие между версиями ядра 5.3 и 5.4. В версии 5.3 вы могли установить vfs_cache_pressure
вплоть до 1
, и система не начинала использовать своп для сохранения dentries
в ОЗУ. С версией ядра 5.4 система намного больше склонна к свопу, если значение опустится ниже 100
.
Я думаю, что мне нужно попытаться оценить различные комбинации значений /proc/sys/vm/vfs_cache_pressure
и /proc/sys/vm/swappiness
. В настоящее время я запускаю vfs_cache_pressure
на уровне 120 и swappiness
на уровне 80, и иногда испытываю замедления, когда фоновый процесс проверяет множество каталогов в системе (например, скрипт резервного копирования, ищущий новые файлы в системе). Мне кажется, что в настоящее время система использует ОЗУ для кеширования dentries
немного слишком агрессивно, и программы, которые требуют больше памяти, замедляются, когда ОЗУ нужно освободить, удалив некоторые другие кеши перед выполнением запроса.
Ответ или решение
Снижение размера кэша для radix_tree_node
в Linux без уменьшения общего размера кэша может быть сложной задачей, но решение все же доступно через некоторые настройки системы. Рассмотрим ключевые моменты, которые могут помочь в оптимизации памяти и улучшении работы вашей системы, опираясь на ваши наблюдения и текущую конфигурацию.
Понимание проблемы
На первых порах стоит обратить внимание на активность кэша radix_tree_node
, которая составляет всего 90%. Это может означать, что часть используемой памяти остается пустой и неэффективно используется. Тем не менее, общий размер кэша не может быть уменьшен напрямую без некоторого вмешательства в его конфигурацию.
Настройки кэша
-
Оптимизация настройки
vfs_cache_pressure
:Настройка
vfs_cache_pressure
определяет, как агрессивно система очищает кэш файловых систем. Вы упомянули, что на более ранних версиях ядра вы могли использовать значения, близкие к 1-10, но с переходом на ядро 5.4 и выше, эти значения должны быть увеличены, чтобы избежать проблем с производительностью. По вашему опыту, значение в 120 может быть уже слишком агрессивным:- Рекомендуется экспериментировать: Попробуйте установить
vfs_cache_pressure
в диапазоне от 100 до 110 и следите за производительностью. Это позволит увеличить количество кэшируемыхdentry
иinode
, что в свою очередь улучшит общую эффективность использования памяти.
- Рекомендуется экспериментировать: Попробуйте установить
-
Настройка
swappiness
:Параметр
swappiness
управляет тем, как система решает, какие страницы памяти должны быть перемещены в файл подкачки. У вас на данный момент установлено значение 80, что может привести к неоправданному использованию файла подкачки, особенно при высокой активности приложений, как, например, скрипты резервного копирования. Рассмотрите возможность установкиswappiness
на 60 или даже ниже, чтобы ваше приложение могло использовать больше оперативной памяти прежде чем будет активировано использование swap.
Мониторинг и тестирование
Важно не только настроить параметры, но и постоянно мониторить поведение системы при этих изменениях:
- Используйте инструменты мониторинга, такие как
slabtop
,htop
илиvmstat
, чтобы следить за использованием памяти и хранения кэша в реальном времени. - Запускайте тесты производительности для скриптов, загружающих директории, и наблюдайте за временем, необходимым для выполнения операций.
Заключение
Reducir кэш radix_tree_node
без уменьшения общего размера кэша требует тщательной оптимизации параметров системы, в частности настройки vfs_cache_pressure
и swappiness
. Путем экспериментов с этими параметрами и постоянного мониторинга состояния системы можно достичь эффективного использования оперативной памяти и улучшения производительности при высоких нагрузках на файловую систему.
Помните, что каждая система уникальна, так что вам может потребоваться ваше собственное время для настройки данных значений в зависимости от вашей специфической нагрузки и конфигурации системы.