
Записки оптимизатора 1С (ч.17). Как избежать падения Postgres при большом потреблении памяти запросами
koloskovv 5 минут назад Записки оптимизатора 1С (ч.17). Как избежать падения Postgres при большом потреблении памяти запросами Простой 9 мин 25 Блог компании SOFTPOINT 1С * PostgreSQL * Высоконагруженные системы *...
Значимый прорыв формирует отрасль ИИ: koloskovv 5 минут назад Записки оптимизатора 1С (ч. Как избежать падения Postgres при большом потреблении памяти запросами Простой 9 мин 25 Блог компании SOFTPOINT 1С * PostgreSQL * Высоконагруженные системы * Microsoft SQL Server * Речь пойдет об одной из старых проблем со стабильностью работы Postgres – об отсутствии полного контроля за потреблением оперативной памяти при выполнении запросов (через work_mem), что в ряде случаев приводит либо к свопированию, либо к падению СУБД и остановке работы информационной системы. Происходит это неожиданно, без предупреждения и в не самый удачный момент, например, ночью, когда все спят.
В системах 1С эта проблема точно существует, в силу использования платформой сложных многоэтажных запросов с большим количеством соединений, группировок и сортировок. Вроде бы на помощь должна прийти технология OOM Killer Linux, но как обычно не все так радужно и есть неприятные нюансы. В управлении памятью Linux существует концепция overcommit, которая позволяет системе выделять больше виртуальной памяти, чем физически доступно.
Технические детали
Это может быть полезно, но требует осторожного подхода для предотвращения проблем с производительностью и стабильностью. По умолчанию Linux использует overcommit памяти, когда ядро разрешает процессам запросить больше памяти, чем физически доступно (vm. overcommit_memory=0).
Если вся доступная память заканчивается, ядро вызывает OOM Killer, который выбирает процесс-жертву по oom_score (чем больше памяти потребляет процесс, тем выше шанс быть убитым)Особенности и недостатки:Непредсказуемость. Ядро выбирает тот процесс, снос которого приведёт к максимальному освобождению памяти. И управляющий процесс Postgres с его огромным shared_buffers является идеальным кандидатом на вылет.
OOM Killer посылает сигнал SIGKILL, что не дает Postgres возможности корректно завершить транзакции и сбросить данные на диск. Почему OOM вообще случается с PostgresГлавная причина – особенность работы postgres с памятью, а точнее, её практически неограниченное суммарное потребление при высокой конкуренции запросов. Про память в Postgres у нас был цикл из трёх статей.
Отраслевые последствия
Если кто не читал, рекомендую. Самый интересный параметр, который напрямую влияет на потребление памяти отдельно взятым запросом – work_mem. Задаёт базовый максимальный объём памяти, который будет использоваться во внутренних операциях (JOIN, ORDER, GROUP BY, UNION и т.
) при обработке запросов в рамках одного рабочего процесса (сессии) прежде, чем будут задействованы временные файлы на диске. Соблазн установить заведомо большое значение для work_mem может очень легко привести к падению всего postgres. Вот выдержка из совсем недавней нашей статьи про высвобождение памяти postgres’ом:Почему нельзя увеличить слишком сильно work_mem, выставив, например, сразу 20 Гб и ничего не проверять по временным файлам?
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





