Подробный гайд по zram, zswap и защите от OOM: Как увеличить RAM на VPS с 1-2 ГБ
Запуск современных стеков (Node.js, PostgreSQL, Docker, тяжелые PHP-фреймворки) на VPS с 1–2 ГБ оперативной памяти — это классическая задача, которая часто заканчивается ошибкой Out Of Memory (OOM).
Использование сжатия памяти — это действительно «магическая таблетка» для таких серверов. Однако в сообществе часто возникает путаница между двумя технологиями: zswap и zram.
Чтобы ваш сервер работал стабильно, давайте разберем обе технологии, настроим их правильно и выжмем максимум из ваших 1–2 ГБ.
Важное уточнение: zswap vs zram
Прежде чем настраивать, нужно понять разницу, так как они работают по-разному:
- zswap (Compressed Swap Cache) — это кэш для свопа. Когда ядро хочет выгрузить страницу памяти на медленный диск (в swap-файл),
zswapперехватывает её, сжимает и кладет в специально выделенную область оперативной памяти. Если эта область переполняется, самые старые страницы всё равно сбрасываются на диск.
Плюс:
Резко снижает износ SSD и убирает "тормоза" при обращении к диску.
Минус:
Требует наличия классического swap-файла на диске.
- zram (Compressed RAM Block Device) — создает виртуальный блочный устройство прямо в оперативной памяти. Swap-файл на диске не нужен вообще. Все выгружаемые страницы сжимаются и лежат в RAM.
Плюс:
Идеально для VPS с 1-2 ГБ. Позволяет "растянуть" память без обращения к диску.
Минус:
Требует чуть больше CPU на сжатие.
Стратегия для VPS 1-2 ГБ:
Мы настроим zram как основной инструмент "растягивания" памяти, а zswap включим как дополнительный кэш, если вы всё же решите оставить дисковый swap.
Часть 1. Настройка zram (Основной инструмент для 1-2 ГБ)
Именно zram позволяет получить те самые коэффициенты сжатия 2:1 или 3:1, превращая 2 ГБ физической памяти в ~4-5 ГБ виртуальной.
1. Установка утилит
Для Debian/Ubuntu:
sudo apt update
sudo apt install zram-tools
(Для AlmaLinux/Rocky: sudo dnf install zram-generator)
2. Выбор алгоритма сжатия (Критически важно!)
От алгоритма зависит баланс между нагрузкой на CPU и степенью сжатия.
LZ4:
Очень быстрый, минимальная нагрузка на CPU. Коэффициент сжатия: 1.5:1 – 2:1. (Рекомендуется для VPS с 1 ядром).
Zstd (Zstandard):
Отличный баланс. Коэффициент сжатия: 2.5:1 – 3:1. (Рекомендуется для VPS с 2+ ядрами).
3. Конфигурация zram
Откройте файл конфигурации:
sudo nano /etc/default/zramswap
Приведите его к следующему виду (раскомментируйте и измените нужные строки):
# Алгоритм сжатия. Zstd дает лучшее сжатие (до 3:1)
ALGO=zstd
# Размер виртуальной памяти.
# Для VPS с 2 ГБ RAM ставим 100-150% от физ. памяти.
# Если RAM 1 ГБ, ставим 150-200%.
PERCENT=150
# Приоритет. Должен быть выше, чем у дискового свопа (обычно -1 или -2)
PRIORITY=100
4. Применение настроек
Перезапустите службу:
sudo systemctl restart zramswap
Проверьте, что устройство создалось и работает:
zramctl
Вы должны увидеть /dev/zram0 с алгоритмом zstd и выделенным объемом.
Часть 2. Настройка zswap (Если используется дисковый Swap)
Если вы используете классический swap-файл на диске и хотите ускорить его с помощью zswap.
1. Проверка поддержки ядром
cat /sys/module/zswap/parameters/enabled
Если выводит N, нужно включить.
2. Включение и настройка через GRUB
Откройте конфигурацию GRUB:
sudo nano /etc/default/grub
Найдите строку GRUB_CMDLINE_LINUX_DEFAULT и добавьте в неё параметры:
zswap.enabled=1 zswap.compressor=zstd zswap.max_pool_percent=25
Примечание:
max_pool_percent=25 означает, что zswap может занять до 25% от всей физической RAM для хранения сжатых страниц. Для VPS с 1-2 ГБ можно аккуратно увеличить до 30, но следите за нехваткой памяти для самих приложений.*
3. Обновление загрузчика и перезагрузка
sudo update-grub
sudo reboot
После перезагрузки проверьте статус:
cat /sys/module/zswap/parameters/enabled # Должно быть Y
Часть 3. Тонкая настройка ядра (Sysctl)
Чтобы ядро Linux правильно использовало сжатую память и не "убивало" процессы раньше времени, нужно изменить параметры виртуальной памяти.
Откройте или создайте файл sysctl:
sudo nano /etc/sysctl.d/99-vps-memory.conf
Добавьте следующие строки:
# vm.swappiness
# Для zram/zswap своппинг в сжатую RAM очень дешев.
# Можно смело ставить 60-80. Это заставит ядро активнее сжимать неактивные страницы,
# освобождая "чистую" RAM для кэша файлов (что ускорит работу сайта/БД).
vm.swappiness = 60
# vm.vfs_cache_pressure
# По умолчанию 100. Уменьшаем до 50, чтобы ядро агрессивнее хранило
# inode и dentry (структуры файловой системы) в памяти.
vm.vm.vfs_cache_pressure = 50
# vm.watermark_scale_factor
# Увеличиваем запас свободной памяти, чтобы ядро раньше начинало
# фоновое сжатие (kswapd) и не уходило в прямое сжатие (которое фризит систему).
# Значение 1000 = 10% от зоны памяти.
vm.watermark_scale_factor = 1000
Примените настройки:
sudo sysctl --system
Часть 4. Спасательный круг: earlyoom
На VPS с 1-2 ГБ RAM, когда память (даже сжатая) заканчивается, ядро вызывает OOM Killer. Стандартный OOM Killer часто работает слишком долго, из-за чего сервер "зависает" на несколько минут, и вы даже не можете подключиться по SSH, чтобы посмотреть, что случилось.
Решение:
Установите earlyoom. Он следит за памятью и убивает самый "прожорливый" процесс (например, упавший в цикл PHP-воркер или MySQL), до того, как система полностью зависнет.
# Для Debian/Ubuntu
sudo apt install earlyoom
sudo systemctl enable --now earlyoom
Это сохранит вам часы нервов при настройке тяжелого стека на слабом VPS.
Важно
1. Если у вас 1 vCPU:
Используйте zram с алгоритмом LZ4. Сжатие будет чуть хуже (2:1), но процессор не захлебнется.
2. Если у вас 2+ vCPU:
Используйте zram с алгоритмом zstd. Вы получите сжатие до 3:1, фактически превратив 2 ГБ RAM в ~5 ГБ.
3. Дисковый swap:
Если вы используете zram на 100-150%, дисковый swap-файл можно вообще не создавать, чтобы сэкономить место на SSD и избежать лишнего I/O.
4. Мониторинг:
Периодически проверяйте, как работает сжатие, командой dmesg | grep zram или cat /sys/block/zram0/mm_stat. Обращайте внимание на колонку mem_used_total (сколько физ. памяти занято) и orig_data_size (сколько данных сжато). Их соотношение покажет ваш реальный коэффициент сжатия.
Эти настройки позволят вашему VPS с 1-2 ГБ RAM комфортно держать связку Nginx + PHP-FPM + Redis + небольшой PostgreSQL, или запускать легкие Docker-контейнеры, без постоянных падений по OOM.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.