запроса освобождается?
Я к тому, что если есть сессия, которая под какой-то запрос выделила 10Mb work_mem, запрос отработал, потом сессия висит в idle — эти 10mb будут всё ещё числиться за этой сессией?
> а вот work_mem выделяется в момент запроса Да не work_mem выделяется, это просто "мягкое" ограничение на выделение локальной памяти одним узлом плана. ;) Так что эта память выделяется по мере надобности, а освобождается в т.ч. и в процессе выполнения запроса (но не всегда, да) . > и по окончании запроса освобождается? Да, должна (не считая всяких там WITH HOLD cursors и т.п. — но тут можно считать и так, что запрос ещё не отработал). > эти 10mb будут всё ещё числиться за этой сессией? Кем будут числиться? ;) Возврат памяти в OS — это инициатива [какой-то] libc, и это уж совсем другая история...
» Да не work_mem выделяется Ну понятно, я имел ввиду — память в рамках work_mem * количество узлов » Кем будут числиться? ;) Ну например когда эти 10MB понадобятся соседней сессии — она сможет их использовать? Все эти приколы про то что не понятно как считать занятую память понятны. Но как не считай, если постгрес падает по OOM это значит что память кончилась :) значит кто-то её выделил...
У Postgres ведь какой-то свой аллокатор завязаный на MemoryContexts
Да. Как раз поэтому явным освобождением памяти большая часть кода не заморачивается вообще — контексты решают. Явное освобождением (или переносом выделения в контекст большей вложенности) разработчики PostgreSQL обычно занимаются только тогда, когда на практике выясняется, что какая-то обработка как-то слишком много памяти выделяет и долго не возвращает (при каких-то условиях).
Обсуждают сегодня