|
|
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
Идентификатор сессии в postgres'е возвращается функцией pg_backend_pid(). Мне нужно отловить момент, когда сессия закрывается. Если, скажем, идентификатор хранится в системной таблице, то я бы повесил на системную таблицу триггер: при удалении (высвобождении) идентификатора (когда сессия закроется), триггер вызывал бы мне определенную plpgsql функцию. Если он нигде не хранится, то, может быть, есть какая-нибудь функция, процедура, срабатывающая при закрытии сессии. Тогда интересно какая. Спасибо за ответы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 12:09 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
PCContra, если через pgbouncer работать в session режиме, можно server_reset_query прописать. на системные каталоги триггеры вроде бы навешивать нельзя, даже если там где-то и хранятся pid'ы backend'ов. возможно еще в каких-то экстеншнах такая функция (можно погуглить по on disconnect trigger) есть, но я не нашел. а что вы хотите при закрытии сессии делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 13:24 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
AlexiusPCContra, если через pgbouncer работать в session режиме, можно server_reset_query прописать. на системные каталоги триггеры вроде бы навешивать нельзя, даже если там где-то и хранятся pid'ы backend'ов. возможно еще в каких-то экстеншнах такая функция (можно погуглить по on disconnect trigger) есть, но я не нашел. а что вы хотите при закрытии сессии делать? Мне надо взять этот идентификатор сессии и удалить его из своей таблицы, в котором он присутствует Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 14:32 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
PCContra, если вам требуется синхронность -- вы попали. во всех смыслах например потому что вы не можете откатить событие кладки бекенда, если у вас далее выскочит ошибка в обработчике этого события следовательно -- асинхронность -- единственное, на что вы можете рассчитывать а это просто периодическое чтение из вьюхи pg_stat_activity -- там все ваши живые пиды валяются. периодическое чтение -- и обработка. воркер любой -- хоть крон, хоть pg_agent , хоть что-то своё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 14:47 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
PCContra, в качестве идентификатора сессии лучше использовать что-то такое (pid + backend_start_time): Код: sql 1. 2. и тогда сессии наверное можно будет удалять периодически (по крону, например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 15:01 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
qwwqPCContra, если вам требуется синхронность -- вы попали. во всех смыслах например потому что вы не можете откатить событие кладки бекенда, если у вас далее выскочит ошибка в обработчике этого события можно, пожалуйста, тут поподробнее? авторследовательно -- асинхронность -- единственное, на что вы можете рассчитывать а это просто периодическое чтение из вьюхи pg_stat_activity -- там все ваши живые пиды валяются. периодическое чтение -- и обработка. воркер любой -- хоть крон, хоть pg_agent , хоть что-то своё. Это пойдет, в принципе. Удалять из logs.pidlist те pid'ы, которых нет во вьюхе pg_stat_activity . Интересно будет протестировать вот такое построение логов ради логина юзера из внешнего приложения (ибо от current_user я отказался по своим соображениям): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: php 1. 2. 3. надо будет протестировать, скажем, на 100 одновременных коннектов Кстати, как это можно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 15:19 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
PCContraа что вы хотите при закрытии сессии делать? Мне надо взять этот идентификатор сессии и удалить его из своей таблицы, в котором он присутствует Код: sql 1. [/quot]а из таблицы зачем удалять? ну и так далее... в общем сразу к бизнес-сути, чтобы не тянуть кота за орган на букву х. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 15:40 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
p2., не мешайте товарищу контре. у него свои тараканы -- биться с ними бесполезно. предлагали неоднократно заюзать переменные сессии -- раз они, сессии, у него не пуллятся. -- не хочет. контра, возьмите поле backend_start из pg_stat_activity в вашу таблицу логирования подключений. как есть, без всяких преобразований -- и будет вам щастье -- сможете делетить даже протухшие пиды, которые опять вернулись в активити. И никакого джоба не надо -- надо проверять актуальность по совпадению backend_start . я, кстати, не понимаю , зачем вам вообще вести такую таблицу -- забираете pid при установке соединения на клиента -- и оттуда шлете во все WHERE "AND backend_pid()= $1". но это всё левак -- т.к. не приложение, написанное так -- не пуллится в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 16:06 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
qwwqпредлагали неоднократно заюзать переменные сессииесли для переменных, то зачем их удалять. ну разве что ос имеет большее чем традиционно-юниксовые 16 бит на номер процесса. но и тогда удалять лишнее можно при инициации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 16:18 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
p2.qwwqпредлагали неоднократно заюзать переменные сессииесли для переменных, то зачем их удалять. ну разве что ос имеет большее чем традиционно-юниксовые 16 бит на номер процесса. но и тогда удалять лишнее можно при инициации "PCContra" последние 3 темы -- и поймёте ход мыслей ТС-а. в частности к вашему "зачем" -- он уже практически пришел в 17960584. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2015, 16:27 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
qwwqp2., не мешайте товарищу контре. у него свои тараканы -- биться с ними бесполезно. предлагали неоднократно заюзать переменные сессии -- раз они, сессии, у него не пуллятся. -- не хочет. контра, возьмите поле backend_start из pg_stat_activity в вашу таблицу логирования подключений. как есть, без всяких преобразований -- и будет вам щастье -- сможете делетить даже протухшие пиды, которые опять вернулись в активити. И никакого джоба не надо -- надо проверять актуальность по совпадению backend_start . я, кстати, не понимаю , зачем вам вообще вести такую таблицу -- забираете pid при установке соединения на клиента -- и оттуда шлете во все WHERE "AND backend_pid()= $1". но это всё левак -- т.к. не приложение, написанное так -- не пуллится в принципе. Что такое "пуллится" ? "зачем вам вообще вести такую таблицу" - ну мне надо pnum (или username, по-вашему), а как я этот pnum возьму? Есть, скажем, таблица, в которой нет поля для юзера. И стоит задача делать логи такой таблицы. Единственно доступная мне хоть какая-то переменная сессии - это pid, а нужно - pnum. Поэтому это - таблица связи. Существуют и другие способы логов. Я вижу 3 варианта: 1) Добавить поле pnum в каждую таблицу ( а также всякие доп поля, типа ip адрес, время изменения, и другую мелочь). Мне в напряг так делать, т.к. это не нужные для бизнес-процесса поля, которые занимают доп место, еще и при LEFT JOIN и других запросах надо смотреть, чтобы они не приводили к ошибкам, типа неоднозначности. Запросы могут тормозить на моем железе - для меня это главное, поэтому даже эксериментировать я не буду 2) Добавить в каждый запрос вставки/изменения/удаления поле pnum, а в триггере возвращать NEW.* только без поля pnum. Хорошая идея, но, опаньки, откуда взять для удаления NEW? Удаление в лог не попадет. Поэтому этот вариант отпадает . Да и в каждый запрос неудобно добавлять внешнюю переменную pnum. Хочу на автомате. 3) Создать множество ролей в самой БД. Не для меня, под существующие бизнес-процесыы - это не подходит. Вариант либо с такой таблицей, либо с пременными сессии. Оба подойдут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2015, 17:31 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
PCContra, 1. пуллится -- обслуживается пуллером соединений когда и зачем -- много соображений, но в том числе потому, что поднятие соединения -- дорого. много простаивающих соединений -- дорого (они держат память, и , хотя бы по минимумув -- семафоры там разные -- немного процессорных ресурсов. Ну и сама техника развода транзакций и всяких там общих ресурсов по процессам наверняка долхна зависеть от числа процессов N и видимо -- хуже чем O(N). как правило на эту тему убедительно выступает максим, со ссылками на всякие нагрузочные тесты. в режиме пула обычно соединение не закреплено за каким--то клиентом (хотя я например для спец задач делаю пул "на соединение"-- но там задача в соединении прослать не одну ,а пакет транзакций в автомате , ответ первой из которых используется в следующей -- и они никого не ждут -- все данные известны на входе. -- отдавать соединение после захвата до конца пакета нет смысла. ) как правило пулер создаёт пул [набор соединений] под (хост,юзера (БД),БД) -- и при передаче его другому запросившему клиенту (с той же ролью==юзером) на автомате выдает discard all; -- сбрасывает переменные сеанса. Поэтому работать с ним удобно через хранимки, в которые передаётся параметром "реальнй юзер", или даже его сеанс (тот или иной способ id-кации) -- а параметры сеанса, если требуется "распределённая" а не транзакционная обработка работы юзера -- пишутся в БД. работа напрямую с таблицами -- как-то не очень оправдана вообще, если это не текст хранимки, ящетаю. Поэтому вот это ваше определение пользователя через pid соединения -- паллиатив, не решающий реальных проблем. Уйдите от прямой работы с таблицами. В каждую хранимку добавьте параметр -- гуид сеанса, который вычисляйте клиентом -- и не будете зависеть от режимов работы -- хотите -- транзакционный пуллинг. хотите -- оставайтесь на сессионном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2015, 18:18 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
qwwq, в мануале есть на эту тему? Жесть какая-то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2015, 19:19 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
PCContraqwwq, в мануале есть на эту тему? Жесть какая-то в каком мануале ? по пыхе? это вобще-то стандартные паттерны работы с БД. наверняка есть и кукбуки для пыхи или вот на хабре нубы любят написать что-то типа "я и пг-баунсер" или "я и пул соединений" т.ч. - ищите в интернетах про работу например из пыхи с pg_bouncer . https://yandex.ru/search/?text=pg_bouncer php&lr=213&clid=2186618 я то саму пыху только для пробы дергал -- пару страничек писал -- подключение к бд, и отрисовку произвольного грида. т.ч. про паттерны для пыхи ничего не скажу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2015, 20:37 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
PCContraqwwq, в мануале есть на эту тему? Жесть какая-то На какую тему? Стандартная рекомендация - количество процессов базы не больше чем 2xчисло ядер доступных на сервере. У версий до 9.4 начинается потеря производительности начиная от 32 коннектов и выше (очень заметная на 64). На 9.4 - при 64 и далее (заметная после 128). Поэтому пока ваша система рассчитана на работу не более чем скажем 50 человек одновременно (50 установленных коннектов к базе) - ваши подходы как-то приемлемы... если на 200+ - ваш подход не рабочий что с ним не делай (будет уже медленно и дорого по ресурсам. Поэтому все системы рассчитанные на массовое обслуживание строятся с использованием connection pooling (pgbouncer). В принципе просто 100 idle коннектов это не особо страшно пока они все сразу не попробуют начать транзакции, но вот если у вас будет 1000 idle коннектов - у вас начнутся проблемы 100%. https://wiki.postgresql.org/wiki/Number_Of_Database_Connections -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2015, 07:34 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
Вот самый последний пост на этот вопрос (который вылезает каждый месяц в рассылке если не часто). От ведущего и главного разработчика: " > So the question is: do idle connections impact performance? Yes. Those connections have to be examined when gathering snapshot information, since you don't know that they're idle until you look. So the cost of taking a snapshot is proportional to the total number of connections, even when most are idle. This sort of situation is known to aggravate contention for the ProcArrayLock, which is a performance bottleneck if you've got lots of CPUs. You'd be a lot better off with a pooler. (There has been, and continues to be, interest in getting rid of this bottleneck ... but it's a problem in all existing Postgres versions.) regards, tom lane " Поэтому ваше решение оно не масштабируемо в принципе по железу вверх (что вы с ним не делайте). PS: кстати... есть интересная идея как вообще вашу проблему решить и поддержку connection pooling оставить и ORM на хранимки не переделывать. Все что надо это добавить в ваш ORM короткий кусок кода который бы после текста запроса ставил бы что то вида --USER: username --IP: ip и так далее всю информацию необходимую для аудита. А дальше триггера (разбор current query регулярными выражениями конечно криво но в принципе это наименее кривое решение из всех вариантов которые у вас обсуждались не требующее смены логики работы кода и структуры базы). Более того в триггере можно запретить выполнение запросов у которых нет audit комментариев. Я подобные вещи ставил в кучу ORM для java/php/perl/pytnon (впрочем для другой задачи но похожей - писать в лог базы URL с которого вызвался запрос для быстрого поиска источника проблемных запросов). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2015, 09:20 |
|
||
|
Где храниться идентификатор, возвращаемый pg_backend_pid()
|
|||
|---|---|---|---|
|
#18+
qwwqпредлагали неоднократно заюзать переменные сессии -- раз они, сессии, у него не пуллятся. -- не хочет. Может и пуллятся, я как-то не заморачивался. Maxim BogukПоэтому все системы рассчитанные на массовое обслуживание строятся с использованием connection pooling (pgbouncer). У меня, наверное, меньше. Пока не стало больше - почитаю про pgbouncer пока есть время ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2015, 15:07 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39020264&tid=1997847]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
185ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 549ms |

| 0 / 0 |
