Как Linux освобождает ОЗУ при излишнем потреблении

«Как Linux освобождает ОЗУ при излишнем потреблении» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Управление памятью в Linux — сложный процесс, направленный на максимально эффективное использование доступной оперативной памяти. Когда активным процессам начинает её не хватать, система задействует несколько механизмов освобождения.

1. Освобождение кэша страниц (Page Cache):

  • Linux активно использует свободную память для кэширования данных с диска (кэш страниц и буферов). Это значительно ускоряет работу.
  • Когда приложению требуется новая память, а свободной нет, ядро немедленно освобождает часть этого кэша. Это нормальное поведение, а не признак нехватки памяти. Память, занятая кэшем, считается «свободной» в контексте выделения новым процессам.

2. Использование подкачки (Swapping):

  • Если давление на память возрастает, ядро начинает перемещать наименее используемые («холодные») страницы памяти из ОЗУ в специальную область на диске — раздел или файл подкачки (swap).
  • Агрессивность этого процесса регулируется параметром vm.swappiness (значение от 0 до 100).
    • Низкое значение (например, 10): Ядро будет стараться как можно дольше держать страницы в ОЗУ, активнее освобождая кэш.
    • Высокое значение (например, 60 — значение по умолчанию в многих дистрибутивах): Ядро будет раньше начинать свопирование.
  • Настройка для production-серверов часто является предметом тюнинга под конкретную нагрузку.

3. Принудительное завершение процессов (OOM Killer):

  • Если все предыдущие меры исчерпаны, и система физически не может выделить память, срабатывает OOM Killer, который завершает один или несколько процессов по алгоритму выбора «жертвы» (см. предыдущий вопрос).

Команды для мониторинга и настройки:

# Просмотр использования памяти (обратите внимание на столбцы 'buff/cache' и 'available')
free -h

# Просмотр и изменение swappiness (изменение теряется после перезагрузки)
cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=30

# Для постоянного изменения добавьте строку в /etc/sysctl.conf
# vm.swappiness=30

# Мониторинг процессов, потребляющих память, в реальном времени
top -o %MEM

Вывод для DevOps: Ключ — в мониторинге метрики Available (а не Free) и настройке алертов на её критическое снижение. Автоматическое масштабирование (вертикальное/горизонтальное) и правильная настройка лимитов памяти для контейнеров (в Docker/Kubernetes) — основные методы предотвращения проблем, а не борьбы с их последствиями.