Подробный гайд: Настройка параметра vm.swappiness в Linux
Настройка параметра vm.swappiness — это один из самых важных и одновременно самых неправильно понимаемых аспектов тюнинга памяти в Linux.
Ниже представлен подробный гайд, который поможет вам понять, как этот параметр работает на самом деле, и как настроить его для достижения идеального баланса между отзывчивостью интерактивных задач и эффективным использованием файлового кэша.
1. Главное заблуждение о vm.swappiness
Миф:
Значение vm.swappiness=60 означает, что система начнет использовать подкачку (swap), когда будет занято 60% оперативной памяти.
Реальность:
Это не порог заполнения RAM. Это коэффициент веса (относительная важность) в алгоритме ядра (reclaim algorithm), который решает, что именно вытеснять из памяти, когда она заканчивается: анонимные страницы (данные запущенных программ) или страничный кэш (кэшированные файлы с диска).
Высокое значение (ближе к 100):
Ядро будет агрессивнее свопить анонимную память (программы), чтобы освободить место для файлового кэша.
Низкое значение (ближе к 0):
Ядро будет агрессивно очищать файловый кэш, чтобы сохранить запущенные программы в RAM, и будет использовать swap только в крайнем случае.
2. Шкала значений (для современных ядер Linux 3.5+)
Диапазон значений: от 0 до 100 (в некоторых новых ядрах до 200):
0: В старых ядрах означало "отключить swap". В современных ядрах это просто очень низкое значение, при котором swap используется только если системе грозит OOM (Out Of Memory).1: Абсолютный минимум свопинга. Ядро будет держать анонимную память в RAM до последнего.10: Рекомендуемое значение для большинства десктопных и интерактивных систем.60: Историческое значение по умолчанию во многих дистрибутивах. Хороший баланс для серверов общего назначения.100: Ядро будет максимально агрессивно выгружать фоновые процессы в swap, чтобы освободить RAM под кэш файлов.
3. Как проверить и изменить значение
Проверка текущего значения:
cat /proc/sys/vm/swappiness
# или
sysctl vm.swappiness
Временное изменение (до перезагрузки):
Отлично подходит для тестирования.
sudo sysctl vm.swappiness=10
Постоянное изменение:
Чтобы настройка сохранилась после перезагрузки, добавьте её в конфигурацию sysctl.
1. Создайте или отредактируйте файл настроек (рекомендуется создавать отдельные файлы в /etc/sysctl.d/):
sudo nano /etc/sysctl.d/99-swappiness.conf
2. Добавьте строку:
vm.swappiness=10
3. Примените изменения без перезагрузки:
sudo sysctl --system
4. Выбор значения под ваши задачи (Баланс и Отклик)
Выбор значения напрямую зависит от сценария использования машины.
Вот готовые рекомендации:
Сценарий А: Десктоп, Рабочая станция, Игровой ПК (Интерактивность)
- Рекомендуемое значение:
1или10 - Почему: Интерактивные приложения (браузер, IDE, игры, аудиоредакторы) требуют мгновенного отклика. Если ядро начнет свопить активные вкладки браузера на диск, вы получите "фризы" и микрозависания. При значении
10ядро будет жертвовать файловым кэшем (который быстро восстановится с диска), чтобы держать ваши программы в быстрой RAM. - Примечание: Если у вас мало RAM (8 ГБ и меньше), ставьте
10. Если RAM много (32+ ГБ), можно смело ставить1.
Сценарий Б: Сервер баз данных (PostgreSQL, MySQL, Redis)
- Рекомендуемое значение:
1(или10) - Почему: Базы данных сами отлично управляют своей памятью. Попадание страниц БД в swap — это катастрофа для производительности (дисковый I/O в разы медленнее RAM). Вам нужно, чтобы ядро вообще не трогало память процессов БД.
- Дополнительно: Для БД часто вообще отключают swap или настраивают
mlockallдля блокировки памяти процесса БД от свопинга.
Сценарий В: Веб-сервер, Файловый сервер, Кэширующий прокси (Файловый кэш)
- Рекомендуемое значение:
30-60 - Почему: Здесь важна скорость чтения файлов с диска. Ядро должно использовать максимум свободной RAM для кэширования файлов. Если запущены какие-то фоновые задачи (cron, логи, мониторинг), их можно спокойно вытеснить в swap, чтобы освободить RAM для файлового кэша.
Сценарий Г: Сервер с очень малым объемом RAM (1-4 ГБ)
- Рекомендуемое значение:
30-60 - Почему: Если вы поставите
1на системе с 2 ГБ RAM, когда память кончится, сработает OOM Killer (Out Of Memory) и просто убьет ваши процессы. Значение60позволит ядру выгружать в swap редко используемые фоновые демоны, сохраняя место для активных задач.
5. Сопутствующие параметры (Для глубокой настройки)
Чтобы тонко настроить баланс между RAM и кэшем, одного swappiness может быть недостаточно. Обратите внимание на эти параметры:
vm.vfs_cache_pressure
Управляет тенденцией ядра к reclaim (освобождению) памяти, занятой inode и dentry (кэш структуры файлов и директорий).
- По умолчанию:
100 - Если поставить
50или ниже: Ядро будет дольше держать метаданные файлов в RAM. Это ускоряет работу с большим количеством мелких файлов (например, компиляция кода, работа с git-репозиториями, почтовые серверы). - Как настроить:
vm.vfs_cache_pressure=50
Использование zram или zswap (Современный подход)
Если вы хотите получить максимальную отзывчивость на десктопе или слабом сервере, вместо (или вместе с) классическим swap на диске используйте zram.
Суть:
zram создает сжатый блок-устройство в самой RAM. Когда ядро хочет свопить данные, оно не пишет их на медленный диск, а сжимает и кладет в другую часть RAM.
Результат:
Вы получаете эффект "расширения" RAM. Декомпрессия процессором происходит в разы быстрее, чем чтение с SSD/HDD. При использовании zram значение vm.swappiness можно смело ставить на 60 или даже 100, так как "своп" происходит внутри быстрой памяти.
6. Мониторинг: Как понять, что настройка работает?
После изменения параметра понаблюдайте за системой под нагрузкой.
1. Смотрим на использование Swap:
watch -n 1 cat /proc/meminfo | grep -i swap
Или используйте htop / btop. Если при swappiness=10 swap остается пустым, даже когда RAM забита на 90% (за счет файлового кэша) — вы настроили всё правильно для десктопа.
2. Смотрим на активность подкачки (Paging/Swapping):
vmstat 1
Смотрите на колонки si (swap in) и so (swap out). Если там постоянно идут ненулевые значения, значит, системе физически не хватает RAM, и она постоянно "мелет" память (thrashing). В этом случае изменение swappiness не поможет, нужно добавлять физическую RAM.
Важно:
- Для персонального ПК/ноутбука ставьте
vm.swappiness=10(или1, если RAM > 16 ГБ). Это уберет микрофризы. - Для сервера общего назначения оставьте
30или60. - Для баз данных ставьте
1и следите, чтобы swap вообще не использовался. - Если система начинает тормозить из-за нехватки памяти — меняйте не только
swappiness, но и рассмотрите внедрениеzram.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.