↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 等待事件 / 文件 I/O

WAIT EVENT · IO文件 I/O

IOTwophaseFileSync

等待两阶段状态文件同步到持久存储。

Waiting for a two phase state file to reach durable storage

文件 I/O 引入 10 现存至 20 devel 0 次变动 实测触发图谱档案

类型
文件 I/O
引入版本
10
版本状态
当前稳定版
覆盖版本
11 个 · 10 – 20
触发路径
实测触发
实测发行版
18.6
名称变动
无
手册章节
监控统计

PostgreSQL 18 手册 官方文档 源码 wait.pg.center

版本轨迹

相对 PostgreSQL 17 无变化。

各版本描述

相邻版本里类型、名称与英文描述都相同的合并成一段,旧的在前。中文取自图谱或本站手册译文,没有译文的只给英文原文。

  1. 1020

    IOTwophaseFileSync

    等待两阶段状态文件同步到持久存储。

    Waiting for a two phase state file to reach durable storage.

触发机制

WAIT_EVENT_TWOPHASE_FILE_SYNC 位于 src/backend/access/transam/twophase.c:1774,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:259。探针覆盖的操作是:等待两阶段状态文件到达持久化存储。PostgreSQL 在 TwophaseFileSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

WAIT_EVENT_TWOPHASE_FILE_SYNC at src/backend/access/transam/twophase.c:1774 is the grep-verified reporting path. The public identity/resource is mapped at src/backend/utils/activity/wait_event_names.txt:259. The instrumented operation is: Waiting for a two phase state file to reach durable storage. PostgreSQL reports TwophaseFileSync around the instrumented file or asynchronous-I/O operation named by this event. The backend resumes after the kernel, storage stack, or I/O worker completes that step.

通常正常

当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。

The wait is normal when the workload is expected to perform this read, write, sync, allocation, or completion operation at the observed rate.

值得警惕

若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

Investigate when it persists with foreground latency, many concurrent waiters, storage tail latency, throttling, or errors.

诊断 SQL

直接在 psql 里跑;标注的是语句里用到的视图与列所要求的最低版本。

正在等待 IO/TwophaseFileSync 的会话Sessions waiting on IO/TwophaseFileSync

PG ≥ 13
SELECT pid, backend_type, usename, datname, application_name,
       state, now() - query_start AS query_age,
       now() - xact_start AS xact_age,
       wait_event_type, wait_event,
       pg_blocking_pids(pid) AS blocking_pids,
       left(query, 160) AS query
FROM pg_stat_activity
WHERE wait_event_type = 'IO'
  AND wait_event = 'TwophaseFileSync'
ORDER BY query_age DESC NULLS LAST;

当前 IO 等待分布Current IO cohort

PG ≥ 13
SELECT wait_event, count(*) AS waiting_sessions,
       count(*) FILTER (WHERE state = 'active') AS active_waiters,
       max(now() - query_start) AS oldest_query
FROM pg_stat_activity
WHERE wait_event_type = 'IO'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;

这些会话的锁与关系上下文Lock and relation context for these sessions

PG ≥ 13
SELECT a.pid, l.locktype, l.mode, l.granted, l.fastpath,
       d.datname, n.nspname, c.relname,
       l.page, l.tuple, l.virtualxid, l.transactionid,
       l.classid, l.objid, l.objsubid
FROM pg_stat_activity AS a
LEFT JOIN pg_locks AS l ON l.pid = a.pid
LEFT JOIN pg_database AS d ON d.oid = l.database
LEFT JOIN pg_class AS c
  ON c.oid = l.relation
 AND l.database = (
       SELECT oid FROM pg_database WHERE datname = current_database()
     )
LEFT JOIN pg_namespace AS n ON n.oid = c.relnamespace
WHERE a.wait_event_type = 'IO'
  AND a.wait_event = 'TwophaseFileSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置步骤

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。
英文原文
  1. Confirm the workload phase should touch this file class.
  2. Correlate with pg_stat_io where available and per-device latency.
  3. Fix the access path, burst shape, or affected storage tier before tuning unrelated memory settings.

相关参数与指标

waiting_sessionswait_event_shareio_read_timeio_write_time

源码证据

图谱在各版本源码树里核对到的位置,新的在前。「触发点」是真正上报等待事件的调用处,「目录定义」只说明这个名字在枚举里存在。

PostgreSQL 18REL_18_6

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的变动清单。

  1. PostgreSQL 10 ← 9.6 新增此事件

    该版起出现

    等待两阶段状态文件同步到持久存储。

同类事件

事件 引入 版本变动 最近变动
IO 文件 I/O 88 个 ↗
AioIoCompletion档案 18 —
等待另一个进程完成 I/O。 现存
AioIoUringExecution档案 18 —
等待通过 io_uring 执行 I/O。 现存
AioIoUringSubmit档案 18 —
等待通过 io_uring 提交 I/O。 现存
BasebackupRead档案 14 171 次
等待基础备份从文件中读取。曾用名 BaseBackupRead 现存
BasebackupSync档案 15 171 次
等待基础备份写入的数据同步到持久存储。曾用名 BaseBackupSync 现存
BasebackupWrite档案 15 171 次
等待基础备份写入文件。曾用名 BaseBackupWrite 现存
BuffileRead档案 10 171 次
等待从缓冲文件中读取。曾用名 BufFileRead 现存
BuffileTruncate档案 14 171 次
等待一个缓冲文件被截断。曾用名 BufFileTruncate 现存
BuffileWrite档案 10 171 次
等待对缓冲文件的写入。曾用名 BufFileWrite 现存
ControlFileRead档案 10 131 次
等待读取pg_control文件。 现存
ControlFileSync档案 10 131 次
等待 pg_control 文件同步到持久存储。 现存
ControlFileSyncUpdate档案 10 131 次
等待对 pg_control 文件的更新同步到持久存储。 现存
ControlFileWrite档案 10 131 次
等待写入pg_control文件。 现存
ControlFileWriteUpdate档案 10 131 次
等待写入以更新 pg_control 文件。 现存
CopyFileCopy档案 18 —
等待文件复制操作。 现存
CopyFileRead档案 10 —
在文件复制操作期间等待读取。 现存
CopyFileWrite档案 10 —
在文件复制操作期间等待写入。 现存
CopyFromRead 19 —
在 COPY FROM 期间等待从管道、文件或程序读取数据。 现存
CopyToWrite 19 —
在 COPY TO 期间等待向管道、文件或程序写入数据。 现存
DataFileExtend档案 10 —
等待关系数据文件被扩展。 现存
DataFileFlush档案 10 —
等待关系数据文件同步到持久存储。 现存
DataFileImmediateSync档案 10 —
等待关系数据文件立即同步到持久存储。 现存
DataFilePrefetch档案 10 —
等待关系数据文件的异步预取。 现存
DataFileRead档案 10 —
等待对关系数据文件的读取。 现存
DataFileSync档案 10 —
等待对关系数据文件的更改同步到持久存储。 现存
DataFileTruncate档案 10 —
等待关系数据文件被截断。 现存
DataFileWrite档案 10 —
等待对关系数据文件的写入。 现存
DsmAllocate档案 16 171 次
等待分配动态共享内存段。曾用名 DSMAllocate 现存
DsmFillZeroWrite档案 10 172 次
等待用零填充动态共享内存的后备文件。曾用名 DSMFillZeroWrite 现存
LockFileAddtodatadirRead档案 10 171 次
在向数据目录锁文件中添加一行时等待读取。曾用名 LockFileAddToDataDirRead 现存
LockFileAddtodatadirSync档案 10 171 次
在向数据目录锁文件中添加一行时,等待数据同步到持久存储。曾用名 LockFileAddToDataDirSync 现存
LockFileAddtodatadirWrite档案 10 171 次
在向数据目录锁文件中添加一行时等待写操作。曾用名 LockFileAddToDataDirWrite 现存
LockFileCreateRead档案 10 —
创建数据目录锁文件时等待读取。 现存
LockFileCreateSync档案 10 —
在创建数据目录锁文件时,等待数据同步到持久存储。 现存
LockFileCreateWrite档案 10 —
在创建数据目录锁文件时等待写操作。 现存
LockFileRecheckdatadirRead档案 10 171 次
在重新检查数据目录锁文件期间等待读取。曾用名 LockFileReCheckDataDirRead 现存
LogicalChangesRead档案 14 —
等待从逻辑变更文件读取。 于 15 移除
LogicalChangesWrite档案 14 —
等待写入逻辑变更文件。 于 15 移除
LogicalRewriteCheckpointSync档案 10 —
在检查点期间等待逻辑重写映射同步到持久存储。 现存
LogicalRewriteMappingSync档案 10 —
在逻辑重写期间等待映射数据同步到持久存储。 现存
LogicalRewriteMappingWrite档案 10 —
在逻辑重写期间等待映射数据的写入。 现存
LogicalRewriteSync档案 10 —
等待逻辑重写映射同步到持久存储。 现存
LogicalRewriteTruncate档案 10 —
在逻辑重写期间等待截断映射数据。 现存
LogicalRewriteWrite档案 10 —
等待逻辑重写映射的写入。 现存
LogicalSubxactRead档案 14 —
等待从逻辑子事务文件读取。 于 15 移除
LogicalSubxactWrite档案 14 —
等待写入逻辑子事务文件。 于 15 移除
RelationMapRead档案 10 —
等待关系映射文件的读取。 现存
RelationMapReplace档案 16 —
等待关系映射文件的替换结果同步到持久存储。 现存
RelationMapSync档案 10 —
等待关系映射文件同步到持久存储。 于 16 移除
RelationMapWrite档案 10 —
等待对关系映射文件的写入。 现存
ReorderBufferRead档案 10 —
在重排序缓冲区管理期间等待读取。 现存
ReorderBufferWrite档案 10 —
在重排序缓冲区管理期间等待写入。 现存
ReorderLogicalMappingRead档案 10 —
在重排序缓冲区管理期间等待读取逻辑映射。 现存
ReplicationSlotRead档案 10 —
等待从复制槽控制文件读取。 现存
ReplicationSlotRestoreSync档案 10 —
在将复制槽控制文件恢复到内存期间,等待该文件同步到持久存储。 现存
ReplicationSlotSync档案 10 —
等待复制槽控制文件同步到持久存储。 现存
ReplicationSlotWrite档案 10 —
等待对复制槽控制文件的写入。 现存
SlruFlushSync档案 10 171 次
在检查点或数据库关闭期间,等待 SLRU 数据同步到持久存储。曾用名 SLRUFlushSync 现存
SlruRead档案 10 171 次
等待读取SLRU页面。曾用名 SLRURead 现存
SlruSync档案 10 171 次
在页面写入后等待 SLRU 数据同步到持久存储。曾用名 SLRUSync 现存
SlruWrite档案 10 171 次
等待SLRU页面的写入。曾用名 SLRUWrite 现存
SnapbuildRead档案 10 —
等待读取序列化的历史系统目录快照。 现存
SnapbuildSync档案 10 —
等待序列化的历史系统目录快照同步到持久存储。 现存
SnapbuildWrite档案 10 —
等待写入序列化的历史系统目录快照。 现存
TimelineHistoryFileSync档案 10 —
等待通过流复制接收的时间线历史文件同步到持久存储。 现存
TimelineHistoryFileWrite档案 10 —
等待通过流复制接收的时间线历史文件的写入。 现存
TimelineHistoryRead档案 10 —
等待读取时间线历史文件。 现存
TimelineHistorySync档案 10 —
等待新创建的时间线历史文件同步到持久存储。 现存
TimelineHistoryWrite档案 10 —
等待写入新创建的时间线历史文件。 现存
TwophaseFileRead档案 10 —
等待读取两阶段状态文件。 现存
TwophaseFileSync档案 10 —
等待两阶段状态文件同步到持久存储。 现存
TwophaseFileWrite档案 10 —
等待对两阶段状态文件的写入。 现存
VersionFileSync档案 15 —
在创建数据库时,等待版本文件同步到持久存储。 现存
VersionFileWrite档案 15 —
在创建数据库时等待版本文件被写入。 现存
WalBootstrapSync档案 10 171 次
在引导过程中等待 WAL 同步到持久存储。曾用名 WALBootstrapSync 现存
WalBootstrapWrite档案 10 171 次
在引导过程中等待WAL页面的写入。曾用名 WALBootstrapWrite 现存
WalCopyRead档案 10 171 次
通过复制一个已有WAL段来创建一个新的WAL段时等待读取。曾用名 WALCopyRead 现存
WalCopySync档案 10 172 次
等待通过复制现有 WAL 段创建的新 WAL 段同步到持久存储。曾用名 WALCopySync 现存
WalCopyWrite档案 10 171 次
通过复制一个已有WAL段来创建一个新的WAL段时等待写入。曾用名 WALCopyWrite 现存
WalInitSync档案 10 171 次
等待新初始化的 WAL 文件同步到持久存储。曾用名 WALInitSync 现存
WalInitWrite档案 10 171 次
在初始化一个新的WAL文件时等待写入。曾用名 WALInitWrite 现存
WalRead档案 10 171 次
等待WAL文件的读取。曾用名 WALRead 现存
WalsenderTimelineHistoryRead档案 10 172 次
在 WAL 发送进程执行时间线命令期间,等待从时间线历史文件读取。曾用名 WALSenderTimelineHistoryRead 现存
WalSummaryRead档案 17 —
等待从 WAL 汇总文件读取。 现存
WalSummaryWrite档案 17 —
等待写入 WAL 汇总文件。 现存
WalSync档案 12 171 次
等待 WAL 文件同步到持久存储。曾用名 WALSync 现存
WalSyncMethodAssign档案 10 172 次
在设置新的 WAL 同步方法时,等待数据同步到持久存储。曾用名 WALSyncMethodAssign 现存
WalWrite档案 10 171 次
等待写入 WAL 文件。曾用名 WALWrite 现存