Artemiy |
---|
Gold_,
В этой транзакции или в другой до?
В этой транзакции в одном аппликейшене делается create/drop temp table + индекс на ней. В этой транзакции в другом аппликейшене не делается DDL.
В другой транзакции, раньше, делается:
|
---|
TRUNCATE TABLE setval create/drop temp SET CONSTRAINTS ALL DEFERRED SET CONSTRAINTS ALL IMMEDIATE
|
|
Без изучения ситуации глазами на репликах во время проблем вряд ли что то удасться сказать.
Обратить внимание на вывод top (LA/cpu usage) и на вывод iostat -x -m 10.
Вариантов много, один из наиболее вероятных - то что что после "делается большой инсерт" вы не делаете принудительный analyze таблицы в той же транзакции.
В итоге если реплика активно с этой таблицей работает может сложится ситуация кривых планов на реплике пока autoanalyze не сработает на мастере, а дальше домино:
кривые планы на реплике ->
CPU/LA в небо ->
замедляется проигрывание WAL c мастера так как ресурсов не хватает
-> даже если мастер быстро сделал autoanalyze когда он там еще проиграется на реплике в таких условиях никто не скажет
-> все грустно и печально (я такое на практике наблюдал пару раз).
В качестве острой приправы при большом max_connections/work_mem сервер у вас еще и в swap улетит вместе с кусками shared_buffer, и станет совсем весело.
PS: включите лог всех запросов с временами на реплике и посмотрите по логу потом чем реплика была занята в это время (если CPU/LA или io utilization были высокими). Ну и не надо ставить max_connections больше чем cpu*2 на чтобы в случае если все коннекты были всетаки заняты работой сервер ну хоть как то отвечал.
--Maxim Boguk
www.postgresql-consulting.ru