PostgreSQL数据库查询监控技术——pg_stat_activity简介

pg_stat_activity是PostgreSQL原生工具,官方说明如下:The pg_stat_activity view will have one row per server process, showing information related to the current activity of that process(该pg_stat_activity视图将为每个服务器进程显示一行,显示与该进程的当前活动相关的信息)。pg_stat_activity作为查询监控的视图,其具有如下特点:

服务端事件采集客户端消费方式历史查询落地性能损耗分布式采集查询性能数据
实时主动拉取

pg_stat_activity

https://www.postgresql.org/docs/14/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW

类型描述
datidoid连接后端的数据库OID
datnamename连接后端的数据库名称
pidinteger后端进程ID
leader_pidinteger并行组负责人进程 ID,如果此进程是并行查询工作者。NULL如果这个进程是并行组长或者不参与并行查询。
usesysidoid登陆后端的用户OID
usenamename登录到该后端的用户名
application_nametext连接到后端的应用名
client_addrinet连接到此后端的客户端的 IP 地址。如果此字段为空,则表明客户端是通过服务器机器上的 Unix 套接字连接的,或者这是一个内部进程,例如 autovacuum。
client_hostnametext连接客户端的主机名,通过client_addr的反向DNS查找报告。这个字段将只是非空的IP连接,并且仅在启用log_hostname时。
client_portinteger客户端用于与此后端通信的 TCP 端口号,或者-1如果使用 Unix 套接字。如果该字段为空,则表明这是一个内部服务器进程。
backend_starttimestamp with time zone该过程开始的时间。对于客户端后端,这是客户端连接到服务器的时间。
xact_starttimestamp with time zone该进程的当前事务开始的时间,如果没有事务处于活动状态,则为 null。如果当前查询是其事务的第一个,则该列等于该query_start列。
query_starttimestamp with time zone当前活动查询开始的时间,如果state不是active,则为最后一个查询开始的时间
state_changetimestamp with time zonestate上次更改的时间
wait_event_typetext后端正在等待的事件类型(如果有);否则为空。见等待事件类型表
wait_eventtext如果后端当前正在等待,则等待事件名称,否则为 NULL。
statetext此后端的当前整体状态。可能的值为:active后端正在执行查询;idle后端正在等待新的客户端命令;idle in transaction后端处于事务中,但当前未执行查询;idle in transaction (aborted)此状态类似于idle in transaction,只是事务中的一条语句导致了错误;fastpath function call后端正在执行快速路径功能;disabled如果在此后端禁用track_activities ,则会报告此状态。
backend_xidxid此后端的顶级事务标识符(如果有)
backend_xminxid当前后端的xmin范围
query_idbigint此后端最近查询的标识符。如果state是active此字段显示当前正在执行的查询的标识符。在所有其他状态下,它显示最后执行的查询的标识符。默认情况下不计算查询标识符,因此该字段将为空,除非启用了compute_query_id参数或配置了计算查询标识符的第三方模块。
querytext此后端最近查询的文本。如果state是active此字段显示当前正在执行的查询。在所有其他状态下,它显示最后执行的查询。默认情况下,查询文本被截断为 1024 字节;这个值可以通过参数track_activity_query_size改变。
backend_typetext当前后端的类型。可能的类型有autovacuum launcher, autovacuum worker, logical replication launcher, logical replication worker, parallel worker, background writer, client backend, checkpointer, archiver, startup, walreceiver,walsender和walwriter. 此外,通过扩展注册的后台进程可能还有其他类型。

wait_event和state列是独立的。如果后端处于active状态,它可能会或可能不会等待某些事件。如果状态为active且wait_event非空,则表示查询正在执行,但在系统中的某个位置被阻塞。

pg_stat_activity视图在src/backend/catalog/system_views.sql定义,

CREATE VIEW pg_stat_activity AS
    SELECT S.datid AS datid, D.datname AS datname, S.pid, S.usesysid, U.rolname AS usename, S.application_name, S.client_addr,
            S.client_hostname, S.client_port, S.backend_start, S.xact_start, S.query_start, S.state_change, S.wait_event_type,
            S.wait_event, S.state, S.backend_xid, s.backend_xmin, S.query, S.backend_type
    FROM pg_stat_get_activity(NULL) AS S
        LEFT JOIN pg_database AS D ON (S.datid = D.oid)
        LEFT JOIN pg_authid AS U ON (S.usesysid = U.oid);

在这里插入图片描述
datid、pid、usesysid、application_name、client_addr、client_hostname、client_port、backend_start、xact_start、query_start、state_change、wait_event_type、wait_event、state、backend_xid、backend_xmin、query、backend_type都从pg_stat_get_activity(NULL)返回的结果中取出。pg_stat_get_activity函数定义在src/backend/utils/adt/pgstatfuncs.c中,代码详情如下所示。
datname是从pg_database中取出
usename是从pg_authid中取出
在这里插入图片描述

基本原理

基本原理上来说GP和PG一致,这里以GP为例来说明。GP启动时在共享内存里分配MaxBackends个PgBackendStatus构造体(见pgstat.c)。client连接到GP Master时,fork出QD进程,QD进程接收Client提交的查询,处理过程中调用pgstat_report_activity()(该函数内获取当前QD进程对应的PgBackendStatus,更新查询基本信息)。查询执行期间,QD进程在各个执行节点调用pgstat_report_*()函数,更新PgBackendStatus中的对应的信息项。当另一个客户端查询pg_stat_activity时,全量访问共享内存中的PgBackendStatus数组,返回成为查询结果集(见pgstatfuncs.c pg_stat_get_activity()函数)

优点:更新共享内存,性能影响小;预分配每个Backend进程的槽位,每个进程都可以无锁地同步存取信息,无锁竞争;提供资源组排队、数据库对象被锁的信息
缺点:扩展性差,增加功能必须修改内核代码;没有历史记录;仅支持主动拉取;没有查询性能数据;非分布式架构,无法从一点观测GP上查询执行全貌

该篇文章是PG/GP查询监控技术系列的首篇博客,欢迎关注博主该系列后续博客。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值