Введение / Зачем это нужно
Оперативная память — критически важный ресурс в Linux-системах. Её нехватка приводит к активному использованию свопа (swap), что резко снижает производительность, особенно на SSD. Этот гайд поможет вам оптимизировать использование RAM с помощью настройки параметров ядра и инструментов вроде zram. После выполнения вы получите более отзывчивую систему, снизите нагрузку на диск и предотвратите внезапные "зависания" из-за нехватки памяти.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к терминалу с правами
sudo. - Установлены базовые утилиты:
free,vmstat,sysctl(входят в состав большинства дистрибутивов). - Рекомендуется: создайте бэкап
/etc/sysctl.conf(sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak), чтобы откатить изменения при ошибках.
Шаг 1: Проверка текущего состояния памяти
Сначала нужно понять, как система использует память сейчас. Выполните:
free -h
Пример вывода:
total used free shared buff/cache available
Mem: 7,7G 3,2G 1,1G 200M 3,4G 4,0G
Swap: 2,0G 512M 1,5G
Обратите внимание:
used— actively used RAM.buff/cache— память, занятая кэшем (может быть освобождена).available— оценка памяти, доступной для новых процессов без свопа.Swap— использование раздела/файла свопа.
Дополнительно запустите vmstat 1 5 (обновление каждую секунду, 5 раз). Критичные столбцы:
si(swap-in) — страницы, загруженные из свопа в RAM.so(swap-out) — страницы, выгруженные из RAM в своп. Еслиsi/soпостоянно > 0 — система активно использует своп, что указывает на нехватку RAM.
Шаг 2: Настройка swappiness
Параметр vm.swappiness управляет склонностью ядра использовать своп (диапазон 0-100). Значение 0 — своп используется только при крайней необходимости, 100 — агрессивно. Для десктопов/серверов с достаточным RAM рекомендуется 10-20.
# Проверим текущее значение
cat /proc/sys/vm/swappiness
# Установим временное значение (например, 10)
sudo sysctl vm.swappiness=10
Чтобы изменение сохранилось после перезагрузки, добавьте в /etc/sysctl.conf:
vm.swappiness=10
Примените:
sudo sysctl -p
⚠️ Важно: Не ставьте
swappiness=0на серверах с высокими нагрузками — это может привести к OOM-убийствам процессов при пиковых нагрузках.
Шаг 3: Очистка кэша памяти (при необходимости)
Кэш (page cache и dentries) автоматически управляется ядром, но иногда (например, после запуска тяжелого приложения) его можно временно очистить для освобождения RAM. Не делайте это регулярно!
# Очистка page cache (значение 1)
echo 1 | sudo tee /proc/sys/vm/drop_caches
# Полная очистка (page cache + dentries + inodes)
echo 3 | sudo tee /proc/sys/vm/drop_caches
После очистки система может на время замедлиться, так как файлы будут загружаться с диска заново.
Шаг 4: Настройка vfs_cache_pressure
Параметр vm.vfs_cache_pressure контролирует, насколько агрессивно ядро восстанавливает память, занятую кэшем метаданных файловой системы (inode/dentry). Увеличение значения (до 200-500) ускоряет освобождение памяти при её нехватке.
# Установим значение 200
sudo sysctl vm.vfs_cache_pressure=200
# Сохраним в /etc/sysctl.conf
echo "vm.vfs_cache_pressure=200" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Шаг 5: Внедрение zram (рекомендуется для SSD)
Zram создаёт сжатый блок устройства в RAM, который используется как своп. Это быстрее традиционного свопа на диске и снижает износ SSD. Идеально для систем без раздела свопа или с малым объёмом RAM.
Установка и настройка:
Для Debian/Ubuntu:
sudo apt update && sudo apt install zram-tools
Для Fedora/CentOS (после включения репозитория):
sudo dnf install zram
Для Arch:
sudo pacman -S zram
Настройте размер в файле конфигурации (обычно /etc/default/zramswap или /etc/modprobe.d/zram.conf). Пример для 50% RAM:
# В /etc/default/zramswap (Debian/Ubuntu)
PERCENTAGE=50
Запустите службу:
sudo systemctl enable --now zramswap
# Или вручную (если нет systemd-юнита)
sudo modprobe zram
echo lz4 | sudo tee /sys/block/zram0/comp_algorithm
echo $(( $(grep MemTotal /proc/meminfo | awk '{print $2}') * 512 / 1024 / 1024 * 50 / 100 )) | sudo tee /sys/block/zram0/disksize
sudo mkswap /dev/zram0
sudo swapon -p 10 /dev/zram0
Проверьте: swapon --show должен отобразить zram0.
Проверка результата
- Сравните
free -hдо и после настроек. Ожидайте:- Увеличение
availableпамяти. - Снижение
si/soвvmstat(ближе к 0). - При использовании zram — появление устройства в
swapon --show.
- Увеличение
- Протестируйте отзывчивость системы:
- Запустите несколько вкладок браузера или тяжёлое приложение.
- Переключайтесь между ними — задержки при переключении должны уменьшиться.
- Мониторинг в реальном времени:
watch -n 1 free -h
Возможные проблемы
1. Своп не уменьшается после настройки swappiness
Причина: Ядро может не сразу применять новые настройки под нагрузкой.
Решение: Перезагрузите систему или дождитесь снижения активности. Проверьте, что значение vm.swappiness изменилось через cat /proc/sys/vm/swappiness.
2. Zram не активируется после перезагрузки
Причина: Служба не включена или конфликт модулей.
Решение:
- Убедитесь, что служба активна:
systemctl status zramswap. - Проверьте модуль ядра:
lsmod | grep zram. Если нет —sudo modprobe zram. - Для ручной настройки добавьте команды в
/etc/rc.localили systemd-юнит.
3. После очистки кэша система зависла на 10-20 секунд
Причина: Ожидание повторной загрузки файлов с диска.
Решение: Это нормально. Не повторяйте очистку часто. Если проблема повторяется — возможно, у вас недостаточно RAM для текущей нагрузки, и нужно рассмотреть апгрейд или дальнейшую оптимизацию (например, уменьшение числа сервисов).
4. Параметры ядра не применяются после редактирования sysctl.conf
Причина: Синтаксическая ошибка в файле или отсутствие модуля ядра.
Решение:
- Проверьте синтаксис:
sudo sysctl -pпокажет ошибки. - Убедитесь, что параметр поддерживается:
sysctl -a | grep vm.swappiness. Если нет — возможно, старое ядро (менее 3.5). Обновите ядро или используйте альтернативные методы (например, systemd-юниты для zram).