Столкнулся с такой ситуацией - процессы postgresql 9.2.4 при длительных подключениях непрерывно кушают память.

Заканчивается это тем, что ядро в конечно итоге убивает одного из них:
pid 10725 (postgres), uid 70, was killed: out of swap space
и мастер начинает перезапускать все остальные процессы

Если смотреть через procstat -v - видно, что непрерывно и монотонно растет область, которая AFAIK соответствует памяти полученной через malloc:
http://shelr.tv/records/51e585ca9660804590000086
(7 Gb в последней строчке - это shared buffers, они шарятся между всеми процессами, и проблема не в них).

(чтобы procstat -v показывать в более удобном виде написал скриптик https://bitbucket.org/citrin/scripts/src/tip/procstat-v.pl)

То что это баг в postgresql 9.2.4 сомнительно. Скорее всего есть какая то проблема в софте работающем с базой. Можно ли это как то выяснить не анализируя запутанный код приложения?

Первая мысль была, что не освобождаются prepared statements, но вывод
select * from pg_prepared_statements;
пустой...

Висящих очень долго транзакций в
pg_stat_activity
тоже не видно...

В конфиге
work_mem = 4MB
temp_buffers = 8MB

а по выводу procstat -v складывается впечатление, что он аллоцируют меньше 2 Mb за раз, так что на work_mem или temp_buffers это не похоже.

Что еще можно посмотреть?

Ответить