DBAtlas · Атлас эксплуатации баз данных

Давление на память / OOM

Память сервера заканчивается, система свопится или активен OOM killer. Сначала определите, кто потребляет память: выделенная память (buffer pool/SGA), память сессий (work_mem/PGA), ОС в целом или ситуация, специфичная для Redis?

Кто потребляет память?

Разделите источник давления на память по уровням. Слишком велика выделенная (фиксированная) память, взрывается память на сессию, её съедает процесс вне БД или дело в собственном управлении памятью Redis?

SELECT component, ROUND(current_size/1024/1024) AS mb FROM v$memory_dynamic_components WHERE current_size>0 ORDER BY current_size DESC;
  • Преобладает выделенная память (buffer pool / SGA)
  • Взрывается память сессий (work_mem / PGA)
  • Процесс вне БД / ОС в целом
  • Специфично для Redis (maxmemory / eviction / фрагментация)

Превышает ли суммарная настроенная память физическую RAM?

Если фиксированная выделенная память велика, возможны два варианта: либо настроенная сумма (buffer pool + сессии + ОС) превышает физическую RAM (over-commit), либо размер разумен, но коэффициент попаданий в кэш всё равно низкий. Сложите настройки и сравните с RAM.

SHOW PARAMETER sga_target;  SHOW PARAMETER pga_aggregate_target;
SELECT ROUND(value/1024/1024/1024,1) AS host_ram_gb FROM v$osstat WHERE stat_name='PHYSICAL_MEMORY_BYTES';
  • Да, настроенная сумма превышает RAM (over-commit)
  • Нет, размер разумен, но коэффициент попаданий в кэш низкий

Первопричина: over-commit памяти

Сумма buffer pool/SGA + памяти сессий + потребностей ОС превышает физическую RAM. Система свопится, или OOM killer завершает процесс.

Первопричина: недостаточный кэш (низкий коэффициент попаданий)

Выделенная память не превышает RAM, но мала относительно рабочего набора; коэффициент попаданий в буферный кэш низкий, и БД постоянно читает с диска.

Первопричина: взрыв памяти сессий

Память на сессию, такая как work_mem/PGA, умноженная на высокую конкурентность, исчерпывает RAM. Каждая операция sort/hash может выделять эту память отдельно.

Первопричина: управление памятью Redis

В Redis used_memory достиг maxmemory, активно вытеснение (eviction) или высокая фрагментация (used_memory_rss >> used_memory). Необходимо разобраться с политикой и фрагментацией.

Первопричина: потребление памяти вне БД

Память потребляет не база данных, а ОС в целом или соседний процесс: другое приложение, давление файлового кэша или вспомогательный процесс с утечкой памяти.

Открыть в DBAtlas →