Когда высвобождается work_mem сессии? Выделяется он при первом обращении (т.е не когда создается подключение а когда уже выполняется какая то сортировка). По освобождению я не нашел информации. Грубо говоря сессии в статусе idle держат эти буферы которые были выделены или как то их освобождают?
Для управления выделением памяти в PostgreSQL используется система memory contexts (см. src/backend/utils/mmgr/README в исходниках). Соответственно, для каждого запроса используется свой контекст (см. src/backend/executor/README), и эта память освобождается по его завершению (т.е. сессии в статусе idle уже освободили эту память). Кстати, есть же https://t.me/pgsql , где на такие вопросы вероятнее получить ответ, мне кажется.
Спасибо за пояснение! 👍
Обычно рабочуу память разные серверные процессы переиспользуют, выделяется она при старте, её соединения используют для запросов в процессе выполнения, и она не освобождается после этого, а отдаётся обратно в пул свободной памяти СУБД для использования сделующим процессом/запросом.
И что в операционку обратно отдаётся?
Это же зависит от libc/OS... В общем получается, что обычно да (linux/glibc).
Ужас... (не верю, но ладно)
А если загрузка высокая, то это как выглядит? Гигабайты занимаются и освобождаются?
В чём ужас-то? У PostgreSQL нет "пула свободной памяти СУБД", выделения выполняются каждым backend. Если поступать наоборот, получится, что процессы "крадут" память у всех — вот это настоящий ужас, нет?
То есть свободная память (доступая другим приложениям) скачет каждую секунду?
Каким ещё другим приложениям, если на хосте с СУБД должна работать только СУБД?
Пгадмин например?
При интенсивной нагрузке — да, вполне возможно.
Обсуждают сегодня