Давление на память / OOM
Симптом
OOM killer завершает процесс, 'out of memory', низкий cache hit ratio, чрезмерный свопинг, Redis 'OOM command not allowed'.
1. Кто потребляет память
Это выделенная память БД (buffer pool/SGA), память сессий (PGA/sort/work_mem) или ОС в целом? Проверьте free/vmstat на уровне ОС и представления памяти внутри БД.
Oracle
SELECT component, current_size/1048576 mb FROM v$memory_dynamic_components WHERE current_size>0;PostgreSQL
SHOW shared_buffers; SHOW work_mem; -- work_mem * connections * number of sorts can blow up in totalMySQL
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW STATUS LIKE 'Innodb_buffer_pool%';Redis
INFO memory # used_memory, maxmemory, mem_fragmentation_ratio2. Отделите конфигурацию от нагрузки
Превышает ли сумма настроек памяти физическую RAM (over-commit)? Посчитайте shared_buffers + (work_mem * параллелизм). Или это кратковременная нагрузка (огромная сортировка/хеш, много подключений)?
3. Специфика Redis: вытеснение и фрагментация
Если used_memory достиг maxmemory, проверьте maxmemory-policy (при noeviction запись отклоняется). Если mem_fragmentation_ratio высокий, используйте MEMORY PURGE / activedefrag. Найдите большие ключи через --bigkeys.
Redis
CONFIG GET maxmemory-policy
MEMORY DOCTOR
redis-cli --bigkeys4. Немедленно снимите нагрузку
Завершите вышедший из-под контроля запрос/сессию, поглощающую память, временно уменьшите память сессий, например work_mem, сбросьте ненужные подключения. Если система уходит в своп, приоритет — выйти из свопа.
5. Правильно рассчитайте размеры
Правильно распределите RAM с помощью калькулятора Tools > Memory/Buffer Pool. Общее правило: на выделенном сервере buffer pool/SGA ~70-80% RAM; общая память сессий, умноженная на параллелизм, не должна превышать RAM. При необходимости добавьте RAM.