Назад | Перейти на главную страницу

Определение процессов, ответственных за запросы, с помощью client_port == - 1 в pg_stat_activity

Я пытаюсь отследить источник запросов postgres, идентифицированный pid. Обычно это можно сделать, найдя поля client_addr и client_port в таблице pg_stat_activity.

Однако у некоторых записей client_port -1 или NULL. Что это означает и как найти источник этих запросов?

Я думаю, что порты NULL указывают на то, что это внутренняя операция postgres, и я подозревал, что -1 означает локальные соединения, но я не мог понять, как локальные соединения взаимодействуют с демоном postgres.

Я нашел волшебный трюк, который, похоже, работает. По крайней мере, на одной конкретной машине с Ubuntu linux.

Запустите lsof на бэкэнде postgres и найдите сокет unix примерно так:

postgres   6571 postgres    8u     unix 0xffff81061ab3a000              205980094 /var/run/postgresql/.s.PGSQL.5432

Значение 205980094 - это индексный дескриптор. Хотя клиентский сокет unix, подключающийся к этому сокету, является анонимным, и вы не можете убедить lsof в Linux сообщить вам конечную точку сокетов unix, он создается в то же время, что и внутренний сокет. Так что, похоже, есть номер inode, который обычно находится рядом с этим номером.

Запуск lsof во всей системе, ограничение на сокеты unix (с использованием grep), а затем сортировка по этому ключу (сортировать -k 7 -n) должен сообщить процессу, ответственному за запрос.

Да, это соединения через локальные соединения unix. Они будут проходить через сокет, который находится в / tmp при исходной установке, или через место вроде / var / run / postgresql, если вы используете установку на основе пакетов.

Должно быть возможно найти клиентский процесс, используя, например, lsof.