Ответ
Управление памятью в 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) — основные методы предотвращения проблем, а не борьбы с их последствиями.