powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
7 сообщений из 7, страница 1 из 1
Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
    #40038562
MurzNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется проблема с PostgreSQL 12 в Ubuntu 20.04 с тем, что он со временем (через 1-3 суток после перезапуска) начинает занимать слишком много памяти (10+ Gb of RAM). На сервере 16Gb, но они нужны для других процессов, так что нужно ограничить потребление RAM PostgreSQL-сервисом до 5-6 Gb максимум.

Причём память занимают именно процессы, обслуживающие активные соединения программ с базой данных, т.к. если перезапустить программу, она обрывает соединения и потребление памяти сервисом PostgreSQL сразу же снижается до 2 Gb. Принудительно обрубать активные соединения - как-то вариант не очень, транзакции могут пострадать.

Как я понимаю, за потребление памяти, расходуемой на конкретные соединения (исключая общие кеши и буферы на все соединения) отвечают только следующие параметры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
shared_buffers
huge_pages
temp_buffers
max_prepared_transactions
work_mem
maintenance_work_mem
autovacuum_work_mem
max_stack_depth
shared_memory_type
dynamic_shared_memory_type

Я уже перепробовал различные варианты зарезания лимитов памяти, на текущий момент установлены следующие параметры:
Код: plaintext
1.
2.
3.
shared_buffers = 2048MB
temp_buffers = 8MB
work_mem = 5140kB
maintenance_work_mem = 8MB
Но всё-равно сервис postgresql распухает до 10+ гигабайт постоянно. При этом активных соединений с базой - всего около 2-8 штук, усреднённо за сутки - 2.5 штуки.

Подскажите пожалуйста, каким образом можно ещё зарезать лимиты расходования памяти, чтобы PostgreSQL не расходовал более 6Gb?

Или хотя бы предложите способ, которым можно увидеть текущую расходуемую память с группировкой по всем активным соединениям (именно их индивидуальную память, без shared)? Через top, pg_top - выводятся только общие цифры (VIRT, RES, SHR) по каждому процессу, которые если сложить - то получается 60+ Gb и толку от этой цифры никакой.

И каким образом можно посмотреть, на что именно в текущий момент расходуется память отдельного процесса postgresql, обслуживающего одно конкретное соединение?
...
Рейтинг: 0 / 0
Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
    #40038567
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
max_connections сколько?
...
Рейтинг: 0 / 0
Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
    #40038618
MurzNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya
max_connections сколько?

20 штук, снижать ниже нельзя, т.к. другие приложения периодически подключаются (и быстро отключаются, так что память освобождается).
...
Рейтинг: 0 / 0
Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
    #40038631
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа на том же сервере?
...
Рейтинг: 0 / 0
Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
    #40038634
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MurzNN
Подскажите пожалуйста, каким образом можно ещё зарезать лимиты расходования памяти, чтобы PostgreSQL не расходовал более 6Gb?

Таких настроек нет.

MurzNN
И каким образом можно посмотреть, на что именно в текущий момент расходуется память отдельного процесса postgresql, обслуживающего одно конкретное соединение?

GDB + call MemoryContextStats(TopMemoryContext)
pg_backend_memory_contexts в pg14

Поскольку расходуете память backend (и довольно быстро) - могу сходу дать два предположения:
- злоупотребляете DO или CALL при слишком старой версии базы (обновляйтесь на актуальный минор)
- активно используете именованные prepare, но не делаете deallocate
- хранимки на интересных PL/что-то
...
Рейтинг: 0 / 0
Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
    #40038654
MurzNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya
Программа на том же сервере?

Да, на том же сервере, держит постоянно от 2 до 6 соединений активных (пул соединений), и как раз эти долгие соединения являются причиной большого расхода памяти, т.к. если их оборвать - память сразу освобождается.
...
Рейтинг: 0 / 0
Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
    #40038657
MurzNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij
MurzNN
И каким образом можно посмотреть, на что именно в текущий момент расходуется память отдельного процесса postgresql, обслуживающего одно конкретное соединение?

Поскольку расходуете память backend (и довольно быстро) - могу сходу дать два предположения:
- злоупотребляете DO или CALL при слишком старой версии базы (обновляйтесь на актуальный минор)
- активно используете именованные prepare, но не делаете deallocate
- хранимки на интересных PL/что-то

У меня, так сказать, "мопед не мой" - приложение стороннее ( Matrix Synapse server ), так что поменять запросы я не могу в нём ;(

Melkij
GDB + call MemoryContextStats(TopMemoryContext)
pg_backend_memory_contexts в pg14

14 версия пока недоступна в репах, самому компилить довольно тяжко. Попробую с GDB разобраться, благодарю за наводку!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ограничить потребление памяти активными соединениями в PostgreSQL - work_mem не помогает
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]