识别负责 pg_stat_activity 中 client_port==-1 的查询的进程

识别负责 pg_stat_activity 中 client_port==-1 的查询的进程

我正在尝试跟踪由 pid 标识的 postgres 查询的来源。通常,您可以通过在 pg_stat_activity 表中查找 client_addr 和 client_port 字段来执行此操作。

但是,有些条目的 client_port 为 -1 或 NULL。这是什么意思?如何找到这些查询的来源?

我认为 NULL 端口表示这是一个内部 postgres 操作,并且我怀疑 -1 表示本地连接 - 但我无法弄清楚本地连接如何与 postgres 守护进程通信。

答案1

我发现了一个似乎有效的魔术。至少在一台特定的 ubuntu linux 机器上。

在 postgres 后端运行 lsof 并找到类似这样的 unix 套接字:

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

值 205980094 是 inode。虽然连接到此套接字的客户端 unix 套接字是匿名的,并且您无法说服 Linux 上的 lsof 告诉您 unix 套接字的端点,但它是在与后端套接字同时创建的。因此似乎有一个通常与此数字相邻的 inode 编号。

在整个系统上运行 lsof,限制为 unix 套接字(使用 grep),然后按此键排序(排序-k 7 -n) 应该可以告诉负责该查询的进程。

答案2

是的,这些是通过本地 unix 连接建立的连接。如果您使用基于包的安装,它们将通过位于源安装的 /tmp 中的套接字或 /var/run/postgresql 之类的位置建立。

例如,可以使用 lsof 来找到客户端进程。

相关内容