洞察探索open banking如何通过小程序容器技术助力金融企业实现数据安全和数字化转型
2078
2022-10-14
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
class="data-table" data-id="t7a7e9d1-Hh8L9KV0" data-transient-attributes="class" data-width="1162px" style="width: 100%; outline: none; border-collapse: collapse;">
列
类型
描述
datid
oid
连接后端的数据库OID
datname
name
连接后端的数据库名称
pid
integer
后端进程ID
leader_pid
integer
并行组负责人进程 ID,如果此进程是并行查询工作者。NULL如果这个进程是并行组长或者不参与并行查询。
usesysid
oid
登陆后端的用户OID
usename
name
登录到该后端的用户名
application_name
text
连接到后端的应用名
client_addr
inet
连接到此后端的客户端的 IP 地址。如果此字段为空,则表明客户端是通过服务器机器上的 Unix 套接字连接的,或者这是一个内部进程,例如 autovacuum。
client_hostname
text
连接客户端的主机名,通过client_addr的反向DNS查找报告。这个字段将只是非空的IP连接,并且仅在启用log_hostname时。
client_port
integer
客户端用于与此后端通信的 TCP 端口号,或者-1如果使用 Unix 套接字。如果该字段为空,则表明这是一个内部服务器进程。
backend_start
timestamp with time zone
该过程开始的时间。对于客户端后端,这是客户端连接到服务器的时间。
xact_start
timestamp with time zone
该进程的当前事务开始的时间,如果没有事务处于活动状态,则为 null。如果当前查询是其事务的第一个,则该列等于该query_start列。
query_start
timestamp with time zone
当前活动查询开始的时间,如果state不是active,则为最后一个查询开始的时间
state_change
timestamp with time zone
state上次更改的时间
wait_event_type
text
后端正在等待的事件类型(如果有);否则为空。见等待事件类型表
wait_event
text
如果后端当前正在等待,则等待事件名称,否则为 NULL。
state
text
此后端的当前整体状态。可能的值为:active后端正在执行查询;idle后端正在等待新的客户端命令;idle in transaction后端处于事务中,但当前未执行查询;idle in transaction (aborted)此状态类似于idle in transaction,只是事务中的一条语句导致了错误;fastpath function call后端正在执行快速路径功能;disabled如果在此后端禁用track_activities ,则会报告此状态。
backend_xid
xid
此后端的顶级事务标识符(如果有)
backend_xmin
xid
当前后端的xmin范围
query_id
bigint
此后端最近查询的标识符。如果state是active此字段显示当前正在执行的查询的标识符。在所有其他状态下,它显示最后执行的查询的标识符。默认情况下不计算查询标识符,因此该字段将为空,除非启用了compute_query_id参数或配置了计算查询标识符的第三方模块。
query
text
此后端最近查询的文本。如果state是active此字段显示当前正在执行的查询。在所有其他状态下,它显示最后执行的查询。默认情况下,查询文本被截断为 1024 字节;这个值可以通过参数track_activity_query_size改变。
backend_type
text
当前后端的类型。可能的类型有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上查询执行全貌
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~