Linux

Управление памятью Linux: диагностика и оптимизация

Этот гайд научит вас диагностировать нехватку оперативной памяти в Linux и применять проверенные методы её оптимизации: от настройки свопа до управления кешем и процессами.

Обновлено 14 февраля 2026 г.
20-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 22.04+Debian 11+CentOS 8+RHEL 9+Fedora 36+

Диагностика нехватки оперативной памяти в Linux

Перед оптимизацией необходимо точно понять, как ваша система использует память. Linux активно кэширует данные в свободной RAM для ускорения работы, поэтому показатель "свободно" (free) в выводе команды free -h часто бывает низким — это нормально.

Ключевые команды для анализа

# Основная информация об использовании RAM и swap
free -h

# Динамический мониторинг с сортировкой по памяти
top
# В top: нажмите 'M' для сортировки по памяти, 'P' — по CPU

# Статистика по виртуальной памяти и активности диска
vmstat 1 5

# Список процессов с сортировкой по потреблению памяти
ps aux --sort=-%mem | head -10

# Подробная информация по процессу (замените <PID>)
cat /proc/<PID>/status | grep -E "Vm(RSS|Swap|Size)"

На что смотреть:

  • Mem: строка в free. Поле available показывает память, доступную для новых приложений без свопа.
  • si/so в vmstat (swap in/out). Постоянные значения > 0 указывают на активное использование swap — признак нехватки RAM.
  • Высокий %MEM у конкретных процессов в top или ps.

Способ 1: Настройка параметра swappiness

vm.swappiness контролирует склонность ядра использовать swap. Значение от 0 до 100.

  • 0: Ядро будет избегать swap, пока не исчерпается физическая RAM и кеш.
  • 60 (по умолчанию): Агрессивное использование swap.
  • 100: Активное вытеснение неактивных страниц в swap.

Рекомендации:

  • Серверы (базы данных, веб-серверы): 10-20. Минимизируют latency.
  • Настольные системы: 10-15. Обеспечивают отзывчивость.
  • Системы с гибернацией: Установите значение 100 или близкое к нему, чтобы гарантировать место для сохранения состояния в swap.

Как изменить временно (до перезагрузки):

sudo sysctl vm.swappiness=10

Как изменить навсегда:

  1. Отредактируйте /etc/sysctl.conf:
    sudo nano /etc/sysctl.conf
    
  2. Добавьте строку:
    vm.swappiness=10
    
  3. Примените изменения:
    sudo sysctl -p
    

Способ 2: Управление swap-пространством

Проверка существующих swap-областей

swapon --show
cat /proc/swaps

Создание swap-файла (если swap недостаточно или отсутствует)

# 1. Создайте файл нужного размера (например, 2 ГБ)
sudo fallocate -l 2G /swapfile

# 2. Установите правильные права доступа
sudo chmod 600 /swapfile

# 3. Создайте swap-область
sudo mkswap /swapfile

# 4. Включите swap-файл немедленно
sudo swapon /swapfile

# 5. Добавьте в /etc/fstab для монтирования при загрузке
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Удаление ненужного swap-файла

sudo swapoff /swapfile
sudo rm /swapfile
# Удалите соответствующую строку из /etc/fstab

⚠️ Важно: Использование swap на SSD сокращает его срок службы. Для серверов с большим объёмом RAM (32+ ГБ) swap часто не требуется.

Способ 3: Очистка файлового кеша (Pagecache, Dentries, Inodes)

Ядро Linux автоматически управляет кешем, освобождая память под новые процессы. Однако в редких случаях (например, после массового удаления миллионов мелких файлов) принудительная очистка может помочь освободить память немедленно.

Уровни очистки:

  1. 1 — Очистить только pagecache.
  2. 2 — Очистить pagecache и dentries.
  3. 3 — Очистить pagecache, dentries и inodes (самый полный).

Команда для очистки (уровень 3):

# Сначала синхронизируйте данные с диска на всякий случай
sync
# Очистите все типы кеша
echo 3 | sudo tee /proc/sys/vm/drop_caches

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

free -h

Поле cached должно значительно уменьшиться, а available — увеличиться.

💡 Совет: Выполняйте очистку только в periods низкой нагрузки (ночью, в выходные). Не делайте это частью регулярного обслуживания.

Способ 4: Управление процессами и их памятью

Если конкретный процесс "съедает" память, рассмотрите следующие действия:

  1. Перезапуск сервиса: Часто помогает освободить утечки памяти (memory leaks).
    sudo systemctl restart <service_name>
    
  2. Ограничение памяти через cgroups: Для недоверенных или непредсказуемых процессов.
    # Создание cgroup и установка лимита (например, 500M)
    sudo systemd-run --scope -p MemoryMax=500M <command>
    
  3. Использование ulimit:
    # Установка лимита на размер памяти для текущей сессии
    ulimit -v 500000  # в килобайтах
    
  4. Завершение проблемного процесса:
    # Найдите PID и завершите (осторожно!)
    sudo kill -9 <PID>
    

Способ 5: Анализ и настройка OOM Killer

Если система полностью исчерпала RAM и swap, ядро активирует OOM (Out-Of-Memory) Killer, который принудительно завершает процессы для освобождения памяти.

  1. Проверьте логи OOM Killer:
    sudo grep -i 'killed process' /var/log/syslog
    sudo journalctl -xe | grep -i oom
    

    Лог покажет, какой процесс был убит и его oom_score.
  2. Настройте oom_score_adj для критичных процессов: Значение от -1000 (максимальная защита) до +1000 (максимальный приоритет на убийство).
    # Установить низкий приоритет на убийство для Nginx
    sudo systemctl set-property --runtime nginx.service OOMScoreAdjust=-900
    
    # Для уже запущенного процесса (по PID)
    echo -900 | sudo tee /proc/<PID>/oom_score_adj
    

    Чтобы изменения сохранились после перезагрузки, используйте systemctl set-property без --runtime или настройте в юните systemd.

Способ 6: Профилактика и долгосрочные решения

  1. Регулярный мониторинг: Настройте алерты в Prometheus/Grafana, Zabbix или даже простой скрипт с cron и mail.
    # Пример скрипта для проверки, если available < 10%
    # (сохраните как /usr/local/bin/check_mem.sh)
    if [ $(free | awk '/Mem:/ {print $7}') -lt $(free | awk '/Mem:/ {print $2}') * 0.1 ]; then
        echo "ALERT: Low memory on $(hostname)" | mail -s "Memory Alert" admin@example.com
    fi
    
  2. Апгрейд RAM: Самый эффективный и надёжный способ. Оцените пиковое потребление за несколько недель (free -h в момент максимальной нагрузки) и добавьте запас.
  3. Оптимизация приложений:
    • Для Java-приложений: настройте -Xmx (максимум heap) в соответствии с доступной RAM.
    • Для веб-серверов (Nginx/Apache): настройте ограничения на количество рабочих процессов (worker_processes, max_connections).
    • Для кэшей (Redis, Memcached): установите maxmemory и политику вытеснения (allkeys-lru, volatile-lru).

Сводная таблица действий

СимптомПервое действиеСледующие шаги
Медленная работа, si/so > 0 в vmstatПроверить free -h, topНастроить swappiness, добавить/увеличить swap, найти прожорливые процессы.
Высокий cached в free, но приложения тормозятОбычно это нормально. Проверить available.Не трогать кеш. Искать原因 в I/O или CPU.
Регулярные сообщения "Killed process" в логахПроверить логи OOM.Настроить oom_score_adj для критичных сервисов, добавить RAM.
Свободная RAM есть, но приложение не может выделить памятьПроверить лимиты (ulimit, cgroups).Увеличить лимиты, проверить на утечки памяти в приложении.

Заключительные рекомендации

Управление памятью в Linux — это баланс между автоматическими механизмами ядра и ручной настройкой. Начните с диагностики (free, top, vmstat), затем:

  1. Для большинства десктопов и серверов достаточно настройки vm.swappiness на значение 10-20.
  2. Swap-файл — простой способ добавить "буфер" без переразметки дисков.
  3. Очистка кеша — крайняя мера, а не рутинная операция.
  4. Если проблема в конкретном приложении — настройте его лимиты или рассмотрите его замену/оптимизацию.
  5. Постоянная нехватка памяти — сигнал к увеличению физической RAM.

Помните: Linux использует свободную RAM для кеширования диска, что увеличивает общую производительность. Цель — не иметь 100% "свободной" RAM, а иметь достаточное количество available памяти для новых процессов и избегать активного использования swap.

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

Чем отличаются RAM и swap в Linux?
Безопасно ли вручную очищать кеш памяти?
Какой оптимальный размер swap для сервера?
Почему после очистки кеша система стала медленнее?

Полезное

Проверьте текущее использование памяти
Проанализируйте процессы-потребители
Настройте параметр swappiness
Оптимизируйте или добавьте swap
Очистите кеш файловой системы (при необходимости)
Настройте OOM Killer или добавьте RAM