pg_wait_sampling: 基于采样的等待事件统计信息

十二月 18, 2023

摘要pg_wait_sampling插件提供了大量基于采样的等待事件统计信息,这些信息有助于优化 PostgreSQL 数据库。

介绍

PostgreSQL 9.6 及以上版本,提供了有关特定进程的当前等待事件的信息。但是,为了收集服务器行为的汇总性的统计信息,用户必须对当前等待事件进行多次采样。pg_wait_sampling是一个用于收集等待事件的采样统计信息的插件。

该模块必须通过将pg_wait_sampling添加到 postgresql.conf 中的shared_preload_libraries参数来加载,因为它需要额外的共享内存并启动后台工作进程。这意味着需要重新启动服务器,才能添加或删除该模块。

启用pg_wait_sampling后,它会收集两种类型的统计信息。

  • 等待事件的历史记录。它的内部结构是一个内存中的环形缓冲区,在给定(可配置)周期内写入每个进程等待事件的采样记录。因此,对于每个正在运行的进程,用户都可以根据配置的历史时间段,查看一定数量的最近采样记录。假设有一个客户端定期读取此历史记录,并将其转储到某个地方,则用户可以拥有连续的历史记录。
  • 等待事件的概要信息。它以内存中哈希表的形式实现,其中每个进程和每个等待事件(以及在启用pg_stat_statements时的每个查询)累积采样计数。此哈希表可以由用户请求重置。假设有一个客户端定期转储概要信息并重置它,用户可以统计一段时间内等待事件出现的频率。

通过与pg_stat_statements插件相结合,该插件还可以提供每个查询的统计信息。

pg_wait_sampling会启动一个特殊的用于收集上述统计信息的后台工作进程。

用法

用户可以使用一组视图和函数与pg_wait_sampling交互。

pg_wait_sampling_current视图 – 有关所有进程(包括后台工作进程)的当前等待事件的信息。

列名 列类型 描述
pid int4 进程 ID
event_type text 等待事件类型名称
event text 等待事件名称
queryid int8 查询的 ID

pg_wait_sampling_get_current(pid int4) 为单个给定进程返回同样的表。

pg_wait_sampling_history视图 – 通过采样到内存环形缓冲区中,获取的等待事件的历史记录。

列名 列类型 描述
pid int4 进程 ID
ts timestamptz 采样时间戳
event_type text 等待事件类型名称
event text 等待事件名称
queryid int8 查询的 ID

pg_wait_sampling_profile视图 – 通过对内存哈希表进行采样,获得的等待事件的概要信息。

列名 列类型 描述
pid int4 进程 ID
event_type text 等待事件类型名称
event text 等待事件名称
queryid int8 查询的 ID
count text 采样计数

pg_wait_sampling_reset_profile()函数重置概要信息。

等待事件统计信息收集器工作进程的工作,由以下 GUC 参数控制。

参数名称 数据类型 描述 默认值
pg_wait_sampling.history_size int4 环形缓冲区中的历史记录数 5000
pg_wait_sampling.history_period int4 历史采样周期(以毫秒为单位) 10
pg_wait_sampling.profile_period int4 概要信息的采样周期(以毫秒为单位) 10
pg_wait_sampling.profile_pid bool 概要信息是否按 pid 采样 true
pg_wait_sampling.profile_queries bool 概要信息是否按查询采样 true

如果pg_wait_sampling.profile_pid设置为 false,则不会以每个进程的方式收集采样概要信息。在这种情况下,pid 的值可能始终为零,并且相应的行包含所有进程的采样。

如果pg_wait_sampling.profile_queries设置为 false,视图中的queryid字段将为零。

超级用户有权限更改这些 GUC 参数。此外,它们被放置在共享内存中。因此,它们可以从任何会话在线更改,并影响工作进程。

有关可能的等待事件列表,请参阅 PostgreSQL 文档