work_mem = 1GB и падение базы по памяти
Вопрос
Чтобы отчёты не писали на диск, админ выставил глобально work_mem = 1GB на сервере с 64 ГБ и max_connections = 200. Через день база упала из-за нехватки памяти. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
work_memвыделяется один раз на весь сервер, значит дело в другомwork_memрезервируется целиком сразу при подключении каждого клиентаwork_memдействует только дляVACUUM, а отчёты тут ни при чём- Это лимит на каждую сортировку или хеш, и запрос берёт его многократноправильный ответ
Разбор
work_mem ограничивает память одной операции: каждого узла Sort, Hash, HashAggregate, причём в каждом параллельном воркере, а хеш-операции могут взять ещё больше (hash_mem_multiplier, по умолчанию 2). Сложный запрос с пятью такими узлами и двумя воркерами может занять 15 × 1 ГБ, а таких запросов идут десятки. Резервируется память по мере надобности, а не при подключении, но в пике хватит и этого. Правильно оставить глобальное значение скромным (десятки мегабайт) и поднимать его точечно для отчётов через SET LOCAL или настройку роли. Для VACUUM и CREATE INDEX есть отдельный maintenance_work_mem.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.