是否可以从 PL/PGSQL 函数内部监控 PostgreSQL 服务器性能?
Is it possible to monitor PostgreSQL server performance from inside a PL/PGSQL function?
这听起来很奇怪,因为我想以编程方式知道在服务器中执行重写 PL/PGSQL 函数是否是 'good moment'。 'good moment' 我的意思是考虑负载级别、并发级别或 PostgreSQL 服务器的任何其他大小的一些直接或计算指标。
我知道有许多专门用于性能跟踪的高级应用程序,例如 https://www.datadoghq.com。但我只想要一个简单的内部 KPI,它可以改变或延迟这些繁重的程序的执行,直到 'better moment' 出现。
其中一些程序清除表,一些对数百万行进行 average/sum 计算,一些检查远程表等。当并发用户时,它们可能会等待 'better moment' 几分钟或几小时压力下降。
有什么想法吗?
您可以通过以下方式查看有多少其他会话处于活动状态:
select count(*) from pg_stat_activity where state='active';
但是您必须是超级用户,或者具有 pg_monitor 角色,否则其他用户会话的状态将为 NULL。如果这让您感到困扰,您可以使用 SECURITY DEFINER 编写一个函数来允许访问此信息。 (无论如何,您可能应该将它放入它自己的函数中,这意味着没有理由需要在 plpgsql 中实现它,除非它是您唯一可用的语言。)
您还可以使用具有适当特权的 pl 语言调用任意 OS 操作。 includes from plpgsql,通过滥用 COPY...FROM PROGRAM
.
这听起来很奇怪,因为我想以编程方式知道在服务器中执行重写 PL/PGSQL 函数是否是 'good moment'。 'good moment' 我的意思是考虑负载级别、并发级别或 PostgreSQL 服务器的任何其他大小的一些直接或计算指标。
我知道有许多专门用于性能跟踪的高级应用程序,例如 https://www.datadoghq.com。但我只想要一个简单的内部 KPI,它可以改变或延迟这些繁重的程序的执行,直到 'better moment' 出现。
其中一些程序清除表,一些对数百万行进行 average/sum 计算,一些检查远程表等。当并发用户时,它们可能会等待 'better moment' 几分钟或几小时压力下降。
有什么想法吗?
您可以通过以下方式查看有多少其他会话处于活动状态:
select count(*) from pg_stat_activity where state='active';
但是您必须是超级用户,或者具有 pg_monitor 角色,否则其他用户会话的状态将为 NULL。如果这让您感到困扰,您可以使用 SECURITY DEFINER 编写一个函数来允许访问此信息。 (无论如何,您可能应该将它放入它自己的函数中,这意味着没有理由需要在 plpgsql 中实现它,除非它是您唯一可用的语言。)
您还可以使用具有适当特权的 pl 语言调用任意 OS 操作。 includes from plpgsql,通过滥用 COPY...FROM PROGRAM
.