Диагностика нехватки оперативной памяти в 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
Как изменить навсегда:
- Отредактируйте
/etc/sysctl.conf:sudo nano /etc/sysctl.conf - Добавьте строку:
vm.swappiness=10 - Примените изменения:
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— Очистить только pagecache.2— Очистить pagecache и dentries.3— Очистить pagecache, dentries и inodes (самый полный).
Команда для очистки (уровень 3):
# Сначала синхронизируйте данные с диска на всякий случай
sync
# Очистите все типы кеша
echo 3 | sudo tee /proc/sys/vm/drop_caches
Проверьте результат:
free -h
Поле cached должно значительно уменьшиться, а available — увеличиться.
💡 Совет: Выполняйте очистку только в periods низкой нагрузки (ночью, в выходные). Не делайте это частью регулярного обслуживания.
Способ 4: Управление процессами и их памятью
Если конкретный процесс "съедает" память, рассмотрите следующие действия:
- Перезапуск сервиса: Часто помогает освободить утечки памяти (memory leaks).
sudo systemctl restart <service_name> - Ограничение памяти через cgroups: Для недоверенных или непредсказуемых процессов.
# Создание cgroup и установка лимита (например, 500M) sudo systemd-run --scope -p MemoryMax=500M <command> - Использование
ulimit:# Установка лимита на размер памяти для текущей сессии ulimit -v 500000 # в килобайтах - Завершение проблемного процесса:
# Найдите PID и завершите (осторожно!) sudo kill -9 <PID>
Способ 5: Анализ и настройка OOM Killer
Если система полностью исчерпала RAM и swap, ядро активирует OOM (Out-Of-Memory) Killer, который принудительно завершает процессы для освобождения памяти.
- Проверьте логи OOM Killer:
sudo grep -i 'killed process' /var/log/syslog sudo journalctl -xe | grep -i oom
Лог покажет, какой процесс был убит и егоoom_score. - Настройте
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: Профилактика и долгосрочные решения
- Регулярный мониторинг: Настройте алерты в 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 - Апгрейд RAM: Самый эффективный и надёжный способ. Оцените пиковое потребление за несколько недель (
free -hв момент максимальной нагрузки) и добавьте запас. - Оптимизация приложений:
- Для Java-приложений: настройте
-Xmx(максимум heap) в соответствии с доступной RAM. - Для веб-серверов (Nginx/Apache): настройте ограничения на количество рабочих процессов (
worker_processes,max_connections). - Для кэшей (Redis, Memcached): установите
maxmemoryи политику вытеснения (allkeys-lru,volatile-lru).
- Для Java-приложений: настройте
Сводная таблица действий
| Симптом | Первое действие | Следующие шаги |
|---|---|---|
Медленная работа, 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), затем:
- Для большинства десктопов и серверов достаточно настройки
vm.swappinessна значение 10-20. - Swap-файл — простой способ добавить "буфер" без переразметки дисков.
- Очистка кеша — крайняя мера, а не рутинная операция.
- Если проблема в конкретном приложении — настройте его лимиты или рассмотрите его замену/оптимизацию.
- Постоянная нехватка памяти — сигнал к увеличению физической RAM.
Помните: Linux использует свободную RAM для кеширования диска, что увеличивает общую производительность. Цель — не иметь 100% "свободной" RAM, а иметь достаточное количество available памяти для новых процессов и избегать активного использования swap.