十二月 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 文档。