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

Всем привет, у меня вопрос. Рекомендация нашими субд выставлена, что

максимальное количество коннектов должно быть кратно cpu тачки. То есть на 6 ядер, 18 потоков. Все что выше, юзать пгбаунсер. У меня вопрос, кому то встречалась в документации пг, эта информация?

17 ответов

21 просмотр

Обычно рекомендуют наоборот выкручивать коннекшены на максимум, ну 1000+ точно делать. PgBouncer это прекрасно и вообще жизнь облегчит, но таких рекомендаций не видел ни разу.

Andrey Dedukh
Обычно рекомендуют наоборот выкручивать коннекшены...

нет, не рекомендуют делать 1000+. надо начать с анализа того, какая доля этих 1000+ реально работает, и сколько там простаивает — вторую часть как раз и можно подрезать, через конфигурацию пулов приложения.

Roman-Khait Автор вопроса
Виктор Егоров
нет, не рекомендуют делать 1000+. надо начать с ан...

Интересует мат часть и зависимость cpu от коннектов

В документации именно такой рекомендации точно нет. Что-то отдалённо похожее (я подчеркнул) написано только в ( https://www.postgresql.org/docs/current/kernel-resources.html ): "If PostgreSQL itself is the cause of the system running out of memory, you can avoid the problem by changing your configuration. In some cases, it may help to lower memory-related configuration parameters, particularly shared_buffers, work_mem, and hash_mem_multiplier. In other cases, the problem may be caused by allowing too many connections to the database server itself. In many cases, it may be better to reduce max_connections and instead make use of external connection-pooling software." Но, вообще, похожие рекомендации нередко встречаются, к примеру: https://www.enterprisedb.com/postgres-tutorials/introduction-postgresql-performance-tuning-and-optimization#maxconnections (и в общем понятно, чем они обоснованы — если активных процессов больше, чем CPU cores, то производительность (в смысле общей пропускной способности) неизбежно страдает; да и per-connection overhead тоже может быть существенным, особенно при неправильной настройке OS). С другой стороны, тут есть тонкость — размер многих внутренних структур данных "завязан" на max_connections (формулы обычно вроде max_connections * что-то), и, как мне кажется, во многих из них неявно заложено, что значение будет хотя бы 100 (чаще всего расчёт на то, что сессии будут использовать эти ресурсы [очень] неравномерно). Просто в качестве иллюстрации — выполнить pg_dump базы, в которой таблиц больше, чем примерно (c точностью до константы, которую я забыл) max_connections * max_locks_per_transaction, не удастся.

Andrey Dedukh
Обычно рекомендуют наоборот выкручивать коннекшены...

А где Вы видели такую рекомендацию (тем более, "обычно")?!

Roman-Khait Автор вопроса
Yaroslav Schekin
В документации именно такой рекомендации точно нет...

О спасибо. Сяду оценю, надо еще бы нт тесты глянуть

Yaroslav Schekin
А где Вы видели такую рекомендацию (тем более, "об...

В документации наверное нигде, на ряде курсов такое рекомендуют. Но давайте объективно, реальный сервер БД (с 10-15 приложениями), без баунсера и с хотя бы 50 юзерами. 100 коннекшенов?

Roman-Khait Автор вопроса
Andrey Dedukh
В документации наверное нигде, на ряде курсов тако...

Я могу озвучить более реальные цифры, 6 приложений. Каждый от 1 до 10 коннешкинов, у каждого приложения 2 экземпляра. Того 120 коннектов в пике. База пг на вм, CPU 6

Andrey Dedukh
В документации наверное нигде, на ряде курсов тако...

а у вас все 50 юзеров открывают соединения и висят в них?

Andrey Dedukh
В документации наверное нигде, на ряде курсов тако...

> В документации наверное нигде Я знаю, что в документации такого точно нет. > на ряде курсов такое рекомендуют А по каким причинам? > Но давайте объективно, реальный сервер БД (с 10-15 приложениями), без баунсера и с хотя бы 50 юзерами. Да, давайте. На реальном сервере сочетания подчёркнутых фактов быть не должно. ;) Иначе может случиться вот так (см. "Risk of overloading the database"): https://www.cybertec-postgresql.com/en/tuning-max_connections-in-postgresql/ Кстати, производительность каких-то внутренних функций в PostgreSQL раньше зависела от max_connections как O(n²) — не знаю, "вылечили" ли всё это сейчас (не слежу).

Yaroslav Schekin
> В документации наверное нигде Я знаю, что в док...

Про документацию - ок, я тоже нигде не встречал. Про курсы - 100 мало, надо или баунсер или 1000+ коннекшенов, если приложения очень активно юзают бд. Про реальный сервер согласен, тоже считаю, что без баунсера это работать не должно. За ссылку большое спасибо, что-то подобное уже читал, но интересно.

Владимир Петров
а у вас все 50 юзеров открывают соединения и висят...

Нет конечно, но не все запросы и не всегда отрабатывают за 1 секунду, если мы не про таблички с 100-1000 записей.

Владимир Петров
так в каких случаях нужно 1000+ я так и не понял

На входе был вопрос: сколько можно без баунсера.

Владимир Петров
так в каких случаях нужно 1000+ я так и не понял

Если нужно, чтобы было ≈ 1000 одновременно активных соединений (очень хорошо, если при этом есть ≈ 300 CPU cores ;) ) и готовность "выбросить" под это дело ≈ 2 GB RAM — придётся ставить и разбираться с проблемами по мере возникновения, как мне кажется.

Andrey Dedukh
На входе был вопрос: сколько можно без баунсера.

Ну так "Почему - как набор рекомендаций, не более." пока похоже на очередной [идиотский] совет из области "мифов и легенд PostgreSQL", вроде "отключи autovacuum", или "партиционируй всё", или "выполняй VACUUM FULL ежедневно"... и т.д. и т.п. ;)

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
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
Карта сайта