由 John Doe 六月 5, 2025
你需要经常查看数据库中的等待事件吗?那么,你知道 PostgreSQL 中某个等待事件的含义吗?
特性提交日志
添加系统视图 pg_wait_events。
这是一个使用集合返回函数构建的视图,它展示了有关等待事件的以下信息:
- 名称
- 类型(Activity、I/O、Extension 等)
- 描述
所有检索到的信息均来自wait_event_names.txt
,且描述内容与文档中的一致,但会过滤掉所有 XML 标记。当此视图与pg_stat_activity
联用时,可用于获取所报告等待事件的描述,非常实用。
该视图还包含了为扩展程序定义的自定义等待事件。
讨论:https://postgr.es/m/0e2ae164-dc89-03c3-cf7f-de86378053ac@gmail.com
示例
PostgreSQL 新版本引入了一个名为pg_wait_events
的系统视图。顾名思义,该视图列出了 PostgreSQL 已知的等待事件。自从 PostgreSQL 9.6 在pg_stat_activity
视图中引入“wait_event_type”和“wait_event”列以来,陆续出现了许多此类的等待事件。
到目前为止,您要么必须转到文档,来获取等待事件的完整列表,要么可以查看源代码中的wait_event_names.txt
:
$ find . -name wait_event_names.txt
./src/backend/utils/activity/wait_event_names.txt
$ head -10 ./src/backend/utils/activity/wait_event_names.txt
#
# wait_event_names.txt
# PostgreSQL wait events
#
# Copyright (c) 2024, PostgreSQL Global Development Group
#
# This list serves as the basis for generating source and documentation files
# related to wait events.
#
# The files generated from this one are:
事实上,pg_wait_events
就是从这个文本文件中获取内容的,所以这就是最终的来源。从视图本身来看,它非常简单:
postgres=# \d pg_wait_events
View "pg_catalog.pg_wait_events"
Column | Type | Collation | Nullable | Default
-------------+------+-----------+----------+---------
type | text | | |
name | text | | |
description | text | | |
等待事件有类型、名称和描述:
select * from pg_wait_events limit 5;
type | name | description
----------+-------------------+-----------------------------------------------------
Activity | ArchiverMain | Waiting in main loop of archiver process
Activity | AutoVacuumMain | Waiting in main loop of autovacuum launcher process
Activity | BgWriterHibernate | Waiting in background writer process, hibernating
Activity | BgWriterMain | Waiting in main loop of background writer process
Activity | CheckpointerMain | Waiting in main loop of checkpointer process
(5 rows)
除了可以直接在 PostgreSQL 内部访问等待事件的描述之外,该视图本身可能没什么用。如果将其与 pg_stat_activity 连接起来,它会更有用。为了了解它是怎么用的,让我们在第一个会话中生成一个等待事件:
begin;
select * from t;
在第二个会话中,将pg_stat_activity
与pg_wait_events
连接起来,您将在 description 列中看到等待事件的完整描述,这非常方便,因为它为您提供了有关等待事件的更多信息:
select a.datname, a.usename, a.state, a.wait_event_type, a.wait_event, b.description
from pg_stat_activity a
join pg_wait_events b
on a.wait_event_type = b.type
and a.wait_event = b.name;
datname | usename | state | wait_event_type | wait_event | description
----------+----------+---------------------+-----------------+---------------------+--------------------------------------------------------------
| | | Activity | ArchiverMain | Waiting in main loop of archiver process
| | | Activity | AutoVacuumMain | Waiting in main loop of autovacuum launcher process
| | | Activity | BgWriterHibernate | Waiting in background writer process, hibernating
| | | Activity | CheckpointerMain | Waiting in main loop of checkpointer process
| postgres | | Activity | LogicalLauncherMain | Waiting in main loop of logical replication launcher process
| | | Activity | WalWriterMain | Waiting in main loop of WAL writer process
postgres | postgres | idle in transaction | Client | ClientRead | Waiting to read data from the client
(7 rows)
非常不错的体验,感谢所有参与的社区人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/1e68e43d3f0ff1dcf4a5926f9d6336b86bda034d