暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

PG等待事件分析表完整版

白鳝的洞穴 2022-02-09
1533
春节前发过一个PG等待事件的表格,不过那时候针对PG等待事件的分析工作还没有完成,表格里很多地方是空的,有些也不够准确。过年期间,我们完成了整个梳理工作。并完成了PG等待事件的知识图谱构建工作。今天,我把这张完整的表格发出来。
当然这个表格中的部分根因分析还不是很准确,甚至还会存在错误,因为我们还没有在真实的环境中做过验证,随着知识图谱在生产环境中的验证,我们会不断的优化这方面的知识。如果有朋友对此也有兴趣,发现了其中的问题,请多多指教,让我也能把这个知识库做的更好。
这张表格的前面两个字段是从PG的官方文档中摘取出来的,不同的PG版本可能略有不同,第三列是根据文档中的英文翻译而来,这部分有可能已经和原文存在一定的偏差,我根据我对这个等待事件的理解进行了一些转译。第四列根因是我分析的这些等待事件可能关联的根因。这里说了“可能”两个字,是因为这些关联根因是我根据翻阅文档、参考源码注释以及以往工作经验分析出来的,大多数并没有经过实际案例的验证,因此目前只能用“可能”两个字,也希望对此有兴趣的朋友们在实践中加以纠正。


分类

名称

描述

关联根因

LWLock

ShmemIndexLock

等待在共享内存中分配内存

共享内存操作,并发

LWLock

OidGenLock

等待分配OID

并发DDL

LWLock

XidGenLock

等待生成事务XID

并发事务

LWLock

ProcArrayLock

等待获得snapshot或者在会话结束时清理XID

并发事务

LWLock

SInvalReadLock

等待从共享缓冲失效队列中检索或删除消息

shared buffers,并发SQL

LWLock

SInvalWriteLock

等待在共享缓冲失效队列中添加消息

shared buffers,并发SQL

LWLock

WALBufMappingLock

等待替换 WAL 缓冲区中的页面

WAL BUFFER,DML,并发写入

LWLock

WALWriteLock

等待从WAL缓冲区中写数据到磁盘

DML,并发写入,磁盘IO性能

LWLock

ControlFileLock

等待读取或者修改控制文件,或者创建一个新的WAL文件

DML,并发写入,磁盘IO性能

LWLock

CheckpointLock

等待执行CKPT

并发事务

LWLock

CLogControlLock

等待读取或者修改事务状态

并发事务

LWLock

SubtransControlLock

等待读取或者修改子事务信息

并发事务,子事务,SAVEPOINT

LWLock

MultiXactGenLock

等待读取或者修改共享组合事务( multixact)状态

并发事务,共享组,SAVEPOINT

LWLock

MultiXactOffsetControlLock

等待读取或者修改组合事务(multixact) 偏移映射信息

并发事务

LWLock

MultiXactMemberControlLock

等待读取或者修改组合事务(multixact) 成员映射信息

并发事务

LWLock

RelCacheInitLock

等待读写 relation cache初始化文件(pg_internal.init)

磁盘IO性能,数据库中表的数量过多

LWLock

CheckpointerCommLock

等待管理fsync 请求

磁盘IO性能,并发写入

LWLock

TwoPhaseStateLock

等待读取或者修改prepared transaction的状态

分布式事务

LWLock

TablespaceCreateLock

等待创建或者删除表空间

表空间操作,磁盘IO性能,文件系统

LWLock

BtreeVacuumLock

等待读取或者修改vacuum相关的B树索引信息

VACUUM,索引

LWLock

AddinShmemInitLock

等待共享内存中的内存空间管理

共享内存初始化

LWLock

AutovacuumLock

等待Autovacuum worker 或者launcher等待读取或者修改 autovacuum worker的当前状态

VACUUM

LWLock

AutovacuumScheduleLock

等待被选择做vacuum 的表仍然需要 vacuuming的确认信息

VACUUM

LWLock

SyncScanLock

等待获取表上扫描的开始位置以便于进行同步扫描

表或索引扫描操作

LWLock

RelationMappingLock

等待更新用于存储目录到文件节点映射的关系映射文件

DDL操作

LWLock

AsyncCtlLock

等待读取或者修改共享通知状态

会话数,并发执行,并发事务

LWLock

AsyncQueueLock

等待读取或者修改通知消息

会话数,并发执行,并发事务

LWLock

SerializableXactHashLock

等待检索或者存储serializable事务相关的信息

事务隔离级别,并发事务

LWLock

SerializableFinishedListLock

等待访问serializable 事务完成清单

事务隔离级别,并发事务

LWLock

SerializablePredicateLockListLock

等待在一个被serializable事务锁锁定的清单上做操作

事务隔离级别,并发事务

LWLock

OldSerXidLock

等待读取或记录冲突的可序列化事务

事务隔离级别,并发事务

LWLock

SyncRepLock

等待读取或更新有关同步复制的信息

流复制,同步复制

LWLock

BackgroundWorkerLock

等待读取后者修改后台worker进程的状态

并行执行,后台进程启动,后台进程关闭

LWLock

DynamicSharedMemoryControlLock

等待读取或者修改动态共享内存状态

动态共享内存分配、释放

LWLock

AutoFileLock

等待修改postgresql.auto.conf 文件

参数文件修改

LWLock

ReplicationSlotAllocationLock

等待分配或者始放一个复制槽

流复制,复制槽

LWLock

ReplicationSlotControlLock

等待读取或者修改复制槽状态

流复制,复制槽

LWLock

CommitTsControlLock

等待读取或者修改事务提交时间戳

事务提交,页控制相关,DB CACHE,并发事务,

LWLock

CommitTsLock

等待读取或者修改事务时间戳的最后值集合

事务提交,并发事务,

LWLock

ReplicationOriginLock

等待设置、删除或使用复制源

流复制

LWLock

MultiXactTruncationLock

等待读取或者截断 multixact 信息

事务并发,大事务

LWLock

OldSnapshotTimeMapLock

等待读取或者修改旧的snapshot控制信息

事务并发,SAVEPOINT

LWLock

BackendRandomLock

等待生成随机数

随机数生成

LWLock

LogicalRepWorkerLock

等待逻辑复制的WORKER结束任务

流复制

LWLock

CLogTruncationLock

等待执行txid_status 或者将可获得的最老的transaction id赋给它

事务并发、磁盘IO性能、检查点配置

LWLock

WrapLimitsVacuumLock

等待修改multixact消耗和transaction id的限制

事务并发,磁盘IO性能,VACUUM、维护WORKER配置

LWLock

NotifyQueueTailLock

等待修改通知消息存储限制

 

LWLock

clog

等待CLOG缓冲区的IO操作

事务并发、磁盘IO性能

LWLock

commit_timestamp

等待 commit timestamp buffer IO操作完成

事务并发、参数配置、磁盘IO性能

LWLock

subtrans

等待 subtransaction buffer IO操作完成

事务并发,磁盘IO性能

LWLock

multixact_offset

等待 multixact offset buffer IO操作完成

事务并发,磁盘IO性能

LWLock

multixact_member

等待 multixact_member buffer IO操作完成

事务并发,磁盘IO性能

LWLock

async

等待async (notify) buffer IO完成

活跃会话、磁盘IO性能

LWLock

oldserxid

等待oldserxid buffer IO完成

磁盘IO性能,事务并发

LWLock

wal_insert

等待将WAL插入缓冲区

事务并发、WALBUFFER

LWLock

buffer_content

等待在DB CACHE中读写数据页

磁盘IO性能、热块、DBCACHE

LWLock

buffer_io

等待数据页IO完成

磁盘IO性能、检查点、热块

LWLock

replication_origin

等待读取或者修改复制进度

数据库复制

LWLock

replication_slot_io

等待复制槽上的IO

数据库复制、磁盘IO性能

LWLock

proc

等待读取或者修改快速路径锁的信息

 

LWLock

buffer_mapping

等待将数据块与缓冲池中的缓冲区关联

DBCACHE,热块冲突

LWLock

lock_manager

在并行执行中,等待为后端添加或检查锁,或者等待加入或退出锁组

事务并发

LWLock

predicate_lock_manager

等待添加或检查谓词锁信息

并发执行

LWLock

parallel_query_dsa

等待并行查询动态共享内存分配锁

 

LWLock

tbm

等待 TBM 共享迭代器锁,一般发生在并行bitmap扫描中,等待TID BITMAP

并发执行、索引扫描

Lock

relation

等待获取关系上的锁

并发执行

Lock

extend

等待扩展 relation结束

 

Lock

frozenid

等待修改 pg_database.datfrozenxid和 pg_database.datminmxid.

VACUUM、磁盘IO性能、数据库配置

Lock

page

等待获取relation中的一个页面的锁

热块、DBCACHE

Lock

tuple

等待获取元组(tuple)锁

热块、事务并发、DBCACHE

Lock

transactionid

等待一个事务结束

事务并发、长事务

Lock

virtualxid

等待获取虚拟XID锁

并发执行、活跃会话

Lock

speculative token

等待获取推测插入锁

热块、事务并发、热表

Lock

object

等待一个非关系数据库锁

 

Lock

userlock

等待获取用户锁

 

Lock

advisory

等待获取建议用户锁

 

BufferPin

BufferPin

等待获得BUFFER的PIN锁

热块、DBCACHE

Activity

ArchiverMain

归档进程的主循环等待

后台进程,一般可忽略

Activity

AutoVacuumMain

autovacuum启动进程的主循环等待

后台进程,一般可忽略

Activity

BgWriterHibernate

后台写入进程等待,正在休眠

后台进程,一般可忽略

Activity

BgWriterMain

bgwriter进程的主循环等待

后台进程,一般可忽略

Activity

CheckpointerMain

CKPT进程主循环等待

后台进程,一般可忽略

Activity

LogicalApplyMain

逻辑应用进程主循环等待

后台进程,一般可忽略

Activity

LogicalLauncherMain

逻辑启动进程主循环等待

后台进程,一般可忽略

Activity

PgStatMain

统计信息采集进程主循环等待

后台进程,一般可忽略

Activity

RecoveryWalAll

实例恢复时等待WAL数据流到达

等待新的WAL数据

Activity

RecoveryWalStream

在恢复时再次尝试检索 WAL 数据之前,等待任何类型的源(本地、存档或流)中的 WAL 数据不可用时

等待新的WAL数据

Activity

SysLoggerMain

syslogger进程主循环等待

后台进程,一般可忽略

Activity

WalReceiverMain

WAL接收进程主循环等待

后台进程,一般可忽略

Activity

WalSenderMain

WAL发送进程主循环等待

后台进程,一般可忽略

Activity

WalWriterMain

WAL写进程主循环等待

后台进程,一般可忽略

Client

ClientRead

等待读取客户端输入

未提交事务,空闲等待

Client

ClientWrite

等待向客户端发送数据

网络、TOPSQL

Client

LibPQWalReceiverConnect

在 WAL 接收器中等待建立与远程服务器的连接。

 

Client

LibPQWalReceiverReceive

等待 WAL 接收器接收来自远程服务器的数据。

 

Client

SSLOpenServer

等待SSL连接

 

Client

WalReceiverWaitStart

等待启动进程发送初始化复制数据流

 

Client

WalSenderWaitForWAL

在WAL发送进程中等待WAL刷新

 

Client

WalSenderWriteData

在 WAL 发送者进程中处理来自 WAL 接收者的回复时等待任何活动

 

Extension

Extension

等待和extension交换数据或消息

和扩展插件有关

IPC

BgWorkerShutdown

等待后台worker关闭

 

IPC

BgWorkerStartup

等待后台worker启动


IPC

BtreePage

等待继续并行 B 树扫描所需的页可用(并行索引扫描)

并行执行

IPC

ExecuteGather

执行Gather时等待子进程的活动

表分析

IPC

LogicalSyncData

等待逻辑复制远程服务发送数据,用于初始表同步

逻辑复制

IPC

LogicalSyncStateChange

等待逻辑复制远程服务改变状态

逻辑复制

IPC

MessageQueueInternal

等待其他进程连接到共享消息队列中

 

IPC

MessageQueuePutMessage

等待写一条协议消息到共享消息队列中

 

IPC

MessageQueueReceive

等待从共享消息队列中接收字节

 

IPC

MessageQueueSend

等待向共享消息队列发送字节

 

IPC

ParallelBitmapScan

等待并行位图索引扫描初始化

并行执行

IPC

ParallelFinish

等待并行查询worker结束计算

并行执行

IPC

ProcArrayGroupUpdate

当事务结束时等待组leader清除transaction id

长事务

IPC

ReplicationOriginDrop

等待复制源变为非活动状态以被删除

复制槽

IPC

ReplicationSlotDrop

等待复制槽变为非活动状态以被删除

复制槽

IPC

SafeSnapshot

一个READ ONLY DEFERRABLE 事务等待snapshot

事务快照

IPC

SyncRep

同步复制时等待远程服务确认

同步复制

Timeout

BaseBackupThrottle

在基础备份时等待限流

复制

Timeout

PgSleep

进程处于 pg_sleep等待

 

Timeout

RecoveryApplyDelay

在恢复时因为WAL延迟到达产生的等待

实例恢复

IO

BufFileRead

bffered文件读等待

磁盘IO,热块,DBCACHE

IO

BufFileWrite

buffered文件写等待

DBCACHE,磁盘IO

IO

ControlFileRead

等待控制文件读

磁盘IO

IO

ControlFileSync

等待控制文件写入持久化存储

磁盘IO

IO

ControlFileSyncUpdate

等待控制文件修改到达持久化存储

磁盘IO

IO

ControlFileWrite

等待写入控制文件

磁盘IO

IO

ControlFileWriteUpdate

等待一个修改控制文件的写操作

磁盘IO

IO

CopyFileRead

COPY命令中的读等待

磁盘IO

IO

CopyFileWrite

COPY命令中的写等待

磁盘IO

IO

DataFileExtend

等待 relation数据文件扩展

磁盘IO,磁盘容量

IO

DataFileFlush

等待 relation数据文件写入持久存储

磁盘IO

IO

DataFileImmediateSync

等待一个立即同步 relation 数据文件写入持久存储

磁盘IO

IO

DataFilePrefetch

等待从Relation数据文件异步预读数据

磁盘IO

IO

DataFileRead

等待从relation数据文件读数据

磁盘IO

IO

DataFileSync

等待 relation 数据文件的变化写入持久存储

磁盘IO

IO

DataFileTruncate

等待relation 数据文件截断

磁盘IO

IO

DataFileWrite

等待 relation数据文件写

磁盘IO

IO

DSMFillZeroWrite

等待向一个动态共享内存文件写入字节0

 

IO

LockFileAddToDataDirRead

向数据字典锁文件添加一行时等待读操作

磁盘IO,并发DDL

IO

LockFileAddToDataDirSync

向数据字典锁文件添加一行时等待数据写入持久存储

磁盘IO,并发DDL

IO

LockFileAddToDataDirWrite

向数据字典锁文件添加一行时等待写操作

磁盘IO,并发DDL

IO

LockFileCreateRead

创建数据字典锁文件时等待读操作

磁盘IO

IO

LockFileCreateSync

创建数据字典锁文件时等待数据写入持久存储

磁盘IO

IO

LockFileCreateWrite

创建数据字典锁文件时等待写操作

磁盘IO

IO

LockFileReCheckDataDirRead

在重新检查数据字典锁文件期间等待读操作

磁盘IO

IO

LogicalRewriteCheckpointSync

CKPT时等待逻辑重写映射到达持久化存储

磁盘IO,检查点,逻辑复制

IO

LogicalRewriteMappingSync

逻辑重写时等待映射数据达到持久化存储

磁盘IO、逻辑复制

IO

LogicalRewriteMappingWrite

逻辑重写时等待写映射数据达到持久化存储

磁盘IO、逻辑复制

IO

LogicalRewriteSync

等待逻辑重写映射到达持久化存储

磁盘IO、逻辑复制

IO

LogicalRewriteTruncate

等待映射数据截断到达持久化存储

磁盘IO、逻辑复制

IO

LogicalRewriteWrite

等待一个逻辑重写映射写操作

磁盘IO、逻辑复制

IO

RelationMapRead

等待Relation Map文件读

磁盘IO、逻辑复制

IO

RelationMapSync

等待Relation Map文件写入持久存储

磁盘IO

IO

RelationMapWrite

等待Relation Map文件写

磁盘IO

IO

ReorderBufferRead

RecorderBuffer管理中等待读操作(逻辑复制)

磁盘IO、逻辑复制

IO

ReorderBufferWrite

RecorderBuffer管理中等待写操作(逻辑复制)

磁盘IO、逻辑复制

IO

ReorderLogicalMappingRead

RecorderBuffer管理中等待逻辑映射文件读操作

磁盘IO、逻辑复制

IO

ReplicationSlotRead

等待复制槽控制文件的读操作

磁盘IO、复制

IO

ReplicationSlotRestoreSync

当复制槽控制文件从内存中复制时等待该文件写入持久存储

磁盘IO、复制

IO

ReplicationSlotSync

等待复制槽控制文件写入持久存储

磁盘IO、复制

IO

ReplicationSlotWrite

等待一个复制槽控制文件写操作

磁盘IO、复制

IO

SLRUFlushSync

检查点或者数据库关闭的时候,等待 SLRU数据写入持久存储

磁盘IO、检查点、数据库关闭

IO

SLRURead

等待SLRU页读取

磁盘IO

IO

SLRUSync

页写入后等待SLRU数据写入持久存储

磁盘IO

IO

SLRUWrite

等待 SLRU 页写操作

磁盘IO

IO

SnapbuildRead

等待读取序列化的历史目录快照

磁盘IO

IO

SnapbuildSync

等待序列化的历史目录快照写入持久存储

磁盘IO

IO

SnapbuildWrite

等待写入序列化的历史目录快照

磁盘IO

IO

TimelineHistoryFileSync

等待通过流式复制接收到的时间线历史文件写入持久存储

磁盘IO

IO

TimelineHistoryFileWrite

流式复制时等待时间线文件上的一个写操作被收到

磁盘IO

IO

TimelineHistoryRead

等待时间线历史文件上的读操作

磁盘IO

IO

TimelineHistorySync

等待新创建的时间线历史文件写入持久存储

磁盘IO

IO

TimelineHistoryWrite

等待新创建的时间线历史文件上的写操作

磁盘IO

IO

TwophaseFileRead

等待两阶段状态文件读操作

磁盘IO、分布式事务

IO

TwophaseFileSync

等待两阶段状态文件写入持久存储

磁盘IO、分布式事务

IO

TwophaseFileWrite

等待两阶段状态文件写操作

磁盘IO、分布式事务

IO

WALBootstrapSync

bootstrap的时候等待WAL文件写入持久存储

磁盘IO、启动

IO

WALBootstrapWrite

bootstrap的时候等待WAL页写操作

磁盘IO、启动

IO

WALCopyRead

当使用拷贝一个现有的WAL 段创建一个新WAL段的时候等待读操作

磁盘IO、复制

IO

WALCopySync

当使用拷贝一个现有的WAL 段创建一个新WAL段的时候等待写入持久存储

磁盘IO、复制

IO

WALCopyWrite

当使用拷贝一个现有的WAL 段创建一个新WAL段的时候等待写操作

磁盘IO、复制

IO

WALInitSync

等待一个新初始化的WAL文件写入持久存储

磁盘IO、检查点

IO

WALInitWrite

初始化新的WAL文件的时候等待写操作

磁盘IO、检查点

IO

WALRead

等待WAL文件读

磁盘IO

IO

WALSenderTimelineHistoryRead

在 walsender 时间线命令期间等待从时间线历史文件中读取

磁盘IO、复制

IO

WALSyncMethodAssign

WAL 同步模式时等待数据写入持久存储

磁盘IO、WAL量

IO

WALWrite

等待WAL文件写

磁盘IO、WAL量

等待事件的关联根因都是相对笼统的,因为从等待事件我们还无法直接定位直接原因,只能初步明确一个大体的方向。如果我们想进一步定位问题,可以通过存在较严重问题的等待事件在pg_activity中对应的会话的其他字段,比如SQL语句等来进一步定位,或者根据等待事件关联的问题领域,再使用其他分析工具去做进一步定位。比如如果我们发现IO问题比较多,那么通过OS的iostat就可以进一步分析IO是否真正存在问题,IO问题到底在哪。

这张表格可以在你遇到PG性能问题的时候,通过等待事件来初步定位问题。不过这张表需要放在一个知识体系中,和其他的运维工具配合,才能发挥更大的作用。在D-SMART中,它已经构建为一个知识,通过PG等待事件分析工具,帮助我们发现系统当前存在的问题。并通过发现的问题自动推荐相关的诊断工具,指导DBA进一步进行精确诊断。


文章转载自白鳝的洞穴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论