172 похожих чатов

Добрый день. Postgres меееедленно но верно отжирает память. PostgreSQL 15.4 (Ubuntu 15.4-2.pgdg22.04+1) Количество

коннектов не меняется, автовакуум не запускается.

Потребление памяти растет вот так (рис)

ps показывает что один и тоот же процесс постгресса со временем все больше и больше потребляет.

Потребляет именно постгрес.

Потом отжирается вся память ОС и приходится перезапускать постгрес.

Что это может быть?

53 ответов

250 просмотров

Добрый день А что показывает select * from pg_stat_activity ?

8921-*** ** ** Автор вопроса
Artem T.
Добрый день А что показывает select * from pg_stat...

показывает одни и те же 25 коннектов, в состоянии idle 99.99% времени.

А что за процесс? И как отожранная память и размер shared_buffers соотносятся?

Для начала — начните фиксировать потребление памяти в числах и по процэссам (как там — все жрут, один жрёт, некоторые жрут...). И по известным методикам (ну там, какая-то сумма из /proc или какой-то отчёт cgroups или что). Будет, как минимум, пища для размышлений.

8921-*** ** ** Автор вопроса
Sergey Gr
А что за процесс? И как отожранная память и размер...

Процессы postgres Память и shared_buffers соотносятся так, что при текущих настройках shared_buffers = 10% ОЗУ постгрес никак всю память отожрать не может в теории, но на практике съедает все.

Ну и как результат? Что за память отожрана? Сколько там в байтах? Это один процэсс или на каждого сколько-то приходится?

8921-*** ** ** Автор вопроса
Ilya Anfimov
Ну и как результат? Что за память отожрана? Скольк...

Результат так себе. Вот, процессы постгресса в формате: PID потребляемая_память название_процесса 1030 218996 postgres 19779 218996 postgres 1033 219132 postgres 1032 219380 postgres 19781 220556 postgres 19780 220572 postgres 33642 221076 postgres 33643 221076 postgres 33652 221076 postgres 33654 221076 postgres 33658 221076 postgres 33661 221076 postgres 33687 221076 postgres 33691 221076 postgres 19796 221144 postgres 19942 221144 postgres 20039 221144 postgres 19789 221216 postgres 1044 222136 postgres 33638 222364 postgres 33619 222480 postgres 1168 223508 postgres 20037 802356 postgres 19795 836428 postgres 19941 850968 postgres И то же самое через пол часа: 1030 218996 postgres 19779 218996 postgres 1033 219132 postgres 1032 219380 postgres 19781 220556 postgres 19780 220572 postgres 35703 220976 postgres 35397 221076 postgres 35398 221076 postgres 35402 221076 postgres 35403 221076 postgres 35429 221076 postgres 35433 221076 postgres 35458 221076 postgres 35471 221076 postgres 19796 221144 postgres 19942 221144 postgres 20039 221144 postgres 19789 221216 postgres 35396 222120 postgres 1044 222136 postgres 1168 223508 postgres 35360 228536 postgres 20037 830260 postgres 19795 873532 postgres 19941 877100 postgres это результат команды ps -e -o pid,vsz,comm= | sort -n -k 2 c grep postgres видно что три нижних процесса потребляют больше и больше памяти, у остальных потребление не меняется.

А что это за процессы? Обычные backends?

8921-*** ** ** Автор вопроса
Sergey Gr
А что это за процессы? Обычные backends?

да, от приложения. работают с JSON. 99% времени idle

8921 *** ** **
да, от приложения. работают с JSON. 99% времени ...

Боюсь не смогу подсказать. JSON велик и удивителен

8921-*** ** ** Автор вопроса
Sergey Gr
Боюсь не смогу подсказать. JSON велик и удивителен

т.е. он может отожрать памяти на 1 pid в 10 раз больше shared_buffers + work_mem ? ... по факту так (

8921 *** ** **
т.е. он может отожрать памяти на 1 pid в 10 раз бо...

Был тут такой фокус https://www.cybertec-postgresql.com/en/memory-context-for-postgresql-memory-management/ не знаю насколько будет информативен в вашем случае

8921-*** ** ** Автор вопроса
Sergey Gr
Был тут такой фокус https://www.cybertec-postgresq...

читаю, спасибо. но пока проблема актуальна (

8921 *** ** **
читаю, спасибо. но пока проблема актуальна (

Так это и не решение - это понять в каком месте проблема

8921 *** ** **
читаю, спасибо. но пока проблема актуальна (

а клиент использует libpq? и какой клиент?

8921 *** ** **
Результат так себе. Вот, процессы постгресса в ф...

И shared_buffers 10% RAM? То есть у вас там два гига? Да, тогда бэкэнды по 800 метров — это сложно. Что жэ, начинайте смотреть, почему/после какого запроса он ест 800 метров. Это вполне можэт быть большое значение одно в запросе, которое требуется пепеложыть пару раз из тапла в тапл.

Ilya Anfimov
И shared_buffers 10% RAM? То есть у вас там два ...

Да его и перекладывать не надо) так просто запросить пару

8921-*** ** ** Автор вопроса
Ilya Anfimov
И shared_buffers 10% RAM? То есть у вас там два ...

ОЗУ там 4 Гб. Меня пугает что отжирание не прекращается до падения сервера :(

8921-*** ** ** Автор вопроса

с чего это интересно нормально при work_mem = 4Mb и 25 коннектах?

8921 *** ** **
с чего это интересно нормально при work_mem = 4Mb ...

1 work_mem на узел 2 результат запроса в памяти

8921 *** ** **
с чего это интересно нормально при work_mem = 4Mb ...

Нет ограничения на память процесса подключенного в pg

8921-*** ** ** Автор вопроса
Ilya Anfimov
И shared_buffers 10% RAM? То есть у вас там два ...

В общем, заметил такую особенность. Делаю SELECT pg_log_backend_memory_contexts(pid); Для прожерливого процесса. И там куча записей: CachedPlan CachedPlanSource CachedPlanQuery Когда делаю для другого pid, который не жрет память - этих записей нет. Скажите, можно как-то отключить кэширование планов или ограничить хотябы? SELECT-ы там одинаковые, двух типов.

8921-*** ** ** Автор вопроса
Konstantin Zaitsev
1 work_mem на узел 2 результат запроса в памяти

что же желать? ведь постгрес жрет в 1000 раз больше чем work_mem ((

8921 *** ** **
В общем, заметил такую особенность. Делаю SELEC...

А какая-нибудь разница в подключенных клиентах есть?

8921-*** ** ** Автор вопроса
Sergey Gr
А какая-нибудь разница в подключенных клиентах ест...

У нормального указан апликэйшн найм PostgreSQL JDBC Driver У прожерливого пусто.

8921 *** ** **
У нормального указан апликэйшн найм PostgreSQL JDB...

А на самом деле кто там с клиентской стороны?

8921-*** ** ** Автор вопроса
Konstantin Zaitsev
Запрос покажите из этих процессов

там только начало видно. SELECT id, value, MAX(CASE key WHEN 'fuel' THEN value2 END) AS name,..

8921 *** ** **
В общем, заметил такую особенность. Делаю SELEC...

Ну, то 5сть эти бэкэнды выполняют одни запросы (процэдуры), а не эти — другие... Запретить кэш планов процэдур вроде можно, но, скорее всего, вопрос у вас совсем не в этом...

Ilya Anfimov
Ну, то 5сть эти бэкэнды выполняют одни запросы (пр...

Да не могут кэш столько есть)))) там сами запросы должны быть интересными

8921 *** ** **
У нормального указан апликэйшн найм PostgreSQL JDB...

А посмотрите ещ1 в эту сторону. Не знаю как там в современных джавах, но в 2016 похожие проблемы и на Оракле ловились https://habr.com/ru/articles/499794/

8921-*** ** ** Автор вопроса
Konstantin Zaitsev
Да не могут кэш столько есть)))) там сами запросы ...

там 152 записи о кэшировании, каждая по 70Кб памяти примерно, итого больше 10Мб, при work_mem=Mb

8921-*** ** ** Автор вопроса
Ilya Anfimov
Ну, то 5сть эти бэкэнды выполняют одни запросы (пр...

Записи о кэше только у прожерливых pid А там же не процедура, там запрос указан. Или этот запрос кусок процедуры?

8921-*** ** ** Автор вопроса
Ilya Anfimov
А проблема у тебя в 500 МБ....

Недавно перезапустил постгрес, пока 500Мб не отожрало, но отжирает потихоньку.

8921 *** ** **
Записи о кэше только у прожерливых pid А там же н...

Вполне вероятно. Кэш планов идёт только для PREPARED запросов и для кода PL/pgSQL.

8921-*** ** ** Автор вопроса
Konstantin Zaitsev
10мб * 25 о чем вы волнуетесь?

Сейчас 10Мб, через час 100Мб, через два упадет сервер.

8921-*** ** ** Автор вопроса
Konstantin Zaitsev
Вы так запрос и не показали

что в логе было то и показал, больше там нет ничего - обрезается.

8921 *** ** **
Недавно перезапустил постгрес, пока 500Мб не отожр...

Потихоньку? Так заставь каждый час бэкэнды передёргивать... Не, твк-то ечть правильный метод – debug symbols, gdb, какой-нибудь malloc debugger... Но ты уверен, что хочешь этим занимать ся?

8921-*** ** ** Автор вопроса
Ilya Anfimov
Потихоньку? Так заставь каждый час бэкэнды передёр...

дело в том, что на версии 9.6 работало без проблем. а на днях обновились до 15-й и начались проблем с памятью.

8921-*** ** ** Автор вопроса
Ilya Anfimov
Вполне вероятно. Кэш планов идёт только для PREPA...

А кэш можно сбросить только через pg_terminate_backend() сессии или как-то более гуманно можно, без обрыва коннекта?

8921 *** ** **
Результат так себе. Вот, процессы постгресса в ф...

vsz это не память, это размер адресного пространства процесса, а на него потом отображаются физическая память, выполняемые файлы и библотеки, можно и просто файлы через mmap подключить, они будут занимать vzs но не физическую память если вы хотите посмотреть сколько физической памяти подключено к адресному пространству процесса то надо смотреть rss, но rss не учитывает shared память (в частности shared_buffers) то есть её страницы будут дублироваться в счётчике rss у каждого процесса

8921-*** ** ** Автор вопроса
S B
vsz это не память, это размер адресного пространст...

rss - а как её посмотреть? в принципе pg_log_backend_memory_contexts показывает память процесса, и она больше в разы чем work_mem (

8921 *** ** **
rss - а как её посмотреть? в принципе pg_log_back...

Она так и должна быть! Что вы к work_mem то привязались?

8921 *** ** **
Результат так себе. Вот, процессы постгресса в ф...

в норме вывод ps в поле rss у idle процессов активно обслуживающих пользовательские сессии должен показывать ~ рамер shared_buffers + ещё N мегабайт на локальные кеши каталога и т.п.

8921-*** ** ** Автор вопроса
S B
в норме вывод ps в поле rss у idle процессов актив...

а, получается вычесть из большего меньший, спасибо )

8921 *** ** **
rss - а как её посмотреть? в принципе pg_log_back...

ну это норм, он же постепенно всё что в pg_catalog — грузит в память в кеши, по мере обращения

8921 *** ** **
не, не должна вроде

Work_mem память выделяемая для выполнения условно одного узла в плане запроса, можно написать запрос и на любое количество work_men почти

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта