Linux

Оптимизация памяти Linux: повышение производительности системы

Этот гайд поможет вам уменьшить потребление памяти, настроить своп и параметры ядра Linux. Вы научитесь контролировать использование RAM и повысите производительность системы без апгрейда железа.

Обновлено 17 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04/22.04Debian 11/12CentOS 7/8Fedora 35+Arch LinuxЛюбой дистрибутив с systemd и ядром 4.x+

Введение / Зачем это нужно

Оперативная память — критически важный ресурс в 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.

Проверка результата

  1. Сравните free -h до и после настроек. Ожидайте:
    • Увеличение available памяти.
    • Снижение si/so в vmstat (ближе к 0).
    • При использовании zram — появление устройства в swapon --show.
  2. Протестируйте отзывчивость системы:
    • Запустите несколько вкладок браузера или тяжёлое приложение.
    • Переключайтесь между ними — задержки при переключении должны уменьшиться.
  3. Мониторинг в реальном времени:
    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).

Часто задаваемые вопросы

Безопасно ли менять параметр swappiness в продакшн-сервере?
Очистка кэша памяти реально помогает или это вредно?
Что лучше: увеличить своп на диске или использовать zram?
Как понять, что память оптимизирована успешно?

Полезное

Проверка текущего состояния памяти
Настройка swappiness
Очистка кэша (при необходимости)
Настройка vfs_cache_pressure
Внедрение zram (рекомендуется для SSD)

Эта статья помогла вам решить проблему?