PG_THREAD_WAIT_STATUS
通过PG_THREAD_WAIT_STATUS视图可以检测当前实例中工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况。具体字段信息如表1所示。
| 名称 | 类型 | 描述 |
|---|---|---|
| node_name | text | 当前节点的名称。 |
| db_name | text | 数据库名称。 |
| thread_name | text | 线程名称。 |
| query_id | bigint | 查询id,对应debug_query_id。 |
| tid | bigint | 当前线程的线程号。 |
| sessionid | bigint | 当前会话id。 |
| lwtid | integer | 当前线程的轻量级线程号。 |
| psessionid | bigint | 父会话ID。 |
| tlevel | integer | streaming线程的层级。 |
| smpid | integer | 并行线程的id。 |
| wait_status | text | 当前线程的等待状态。等待状态的详细信息请参见表2。 |
| wait_event | text | 如果wait_status是acquire lock、acquire lwlock、wait io三种类型,此列描述具体的锁、轻量级锁、I/O的信息。否则是空。 |
| locktag | text | 当前线程正等待获取的锁的信息。 |
| lockmode | text | 当前线程正等待获取的锁的模式。包含表级锁、行级锁、页级锁下的各模式。 |
| block_sessionid | bigint | 阻塞当前线程获取锁的会话标识。 |
| global_sessionid | text | 全局会话id。 |
wait_status列的等待状态如表2所示。
| wait_status值 | 含义 | 出现原因 | 调优建议 |
|---|---|---|---|
| wait cmd | 等待完成读取网络通信包。 | 本端等待对端的下一条指令。 | 通常情况下,相比其他操作,网络通信本身耗时较长。如果发现某些连接长时间处于该状态,可以结合pg_stat_activity、gs_stack、dbe_perf.pooler_status、pg_thread_wait_status等视图分析对端长时间未发送指令的原因。 |
| wait pooler get conn | 等待pooler完成获取连接。 | 本端节点尝试从连接池获取与其他节点的连接,如果连接池里没有符合条件的连接,则尝试创建新的连接。如果连接能直接从连接池中复用,这种情况下获取连接的耗时不会很大。如果业务量大、且连接重新创建的情况较多(如连接池中连接被清理、连接因出错而直接被销毁没有归还到连接池中等),会出现获取连接耗时较长。 | 根据业务场景调整GUC参数minimum_pool_size、pooler_maximum_idle_time,并结合日志排查当前连接情况,如果日志中出现大量连接销毁的日志则需要分析原因。 |
| wait pooler abort conn | 等待pooler完成终止连接。 | 由clean connection触发,用于等待符合条件的事务退出、释放连接。 | 清理连接前停止业务。 |
| wait pooler clean conn | 等待pooler完成清理连接。 | 由clean connection触发,用于等待符合条件的线程退出、释放连接。 | 清理连接前停止业务。 |
| pooler create conn | 等待pooler建立连接,当前正在与nodename指定节点建立连接,且仍有N个连接等待建立。 | 与指定节点建连,如果网络状态较差、或对端业务较忙,会影响建连耗时。 | 检查网络状态,或降低业务量。 |
| set cmd | 在连接上执行SET/RESET/TRANSACTION BLOCK LEVEL PARA SET/SESSION LEVEL PARA SET,当前正在nodename指定节点上执行。 | 正在往指定节点执行SET/RESET/TRANSACTION BLOCK LEVEL PARA SET/SESSION LEVEL PARA SET。 | 检查网络状态,或降低业务量。 |
| cancel query | 取消某连接上正在执行的SQL语句。 | 本端向对端发送取消语句指令后,等待对端返回执行结果。 | 检查网络状态,或降低业务量。 |
| stop query | 停止某连接上正在执行的查询。 | 本端向对端发送取消语句指令后,等待对端返回执行结果。 | 检查网络状态,或降低业务量。 |
| wait node | 等待接收与某节点的连接上的数据,当前正在等待nodename节点plevel线程的数据,且仍有N个连接的数据待返回。如果状态包含phase信息,则可能的阶段状态有:
| 本端发送指令后,等待对端返回执行结果。 | 通常情况下,相比其他操作,网络通信本身耗时较长。如果发现某些连接长时间处于该状态,可以结合pg_stat_activity、gs_stack、dbe_perf.pooler_status、pg_thread_wait_status等视图分析对端长时间未发送指令的原因。 |
| wait transaction sync | 等待xid指定事务同步。 | 等待本地事务完成。 | 修改transaction_sync_naptime参数。 |
| wait wal sync | 等待特定lsn的WAL LOG完成到备机的同步。 | 开启了主备日志强同步。 | 修改为本地提交。 |
| wait data sync | 等待完成数据页到备机的同步。 | 开启了数据页强同步到从备。 | 关闭混合流复制功能enable_mix_replication。 |
| wait wal flush | 主机中等待Xlog落盘以及DCF模式下与备机达成共识,备机中等待刷新完最小恢复点以及DCF模式下跟主机达成共识。 | 等待日志落盘或刷新最小恢复点。 | 检查I/O性能。 |
| wait data sync queue | 等待把行存的数据页放入同步队列。 | 开启了数据页强同步从备。 | 关闭混合流复制功能enable_mix_replication。 |
| flush data | 等待向网络中nodename指定节点的plevel对应线程发送数据。如果状态包含phase信息,则可能的阶段状态为wait quota,即当前通信流正在等待quota值。 | 正在向其他节点发送数据。 | 检查网络状态,或降低业务量。 |
| wait reserve td | 用于在对Uheap页面进行DML时分配Uheap页面的tdslot。 | 对Ustore表执行DML。 | 减少对Ustore表的并发DML操作。 |
| wait td rollback | 用于在对Uheap页面tdslot上的待回滚的事务做页内回滚。 | 对Ustore表执行DML时无直接可使用的tdslot,需要释放abort且未回滚事务的tdslot。 | 减少对Ustore表的并发DML操作。 |
| wait available td | 用于等待Uheap和Ubtree页面的空闲td。 | 对Ustore表进行DML时,Uheap、Ubtree页面上暂时无可分配的td。 | 减少对Ustore表的并发DML操作。 |
| wait transaction rollback | 用于等待某事务ID对应的undo回滚完成。 | 对Ustore表进行DML时,事务abort。 | 减少对Ustore表进行DML操作的事务abort。 |
| prune table | 等待堆表清理历史删除数据。 | 触发了页面清理。 | 减少Ustore表的并发DML。 |
| prune index | 等待索引清理历史删除数据。 | 执行vacuum。 | 减少并行vacuum操作。 |
| stream get conn | 初始化stream flow时,等待与nodename节点的consumer对象建立连接,且当前有N个待建连对象。 | 发送建连请求,等待对端返回结果。 | 在对端通过PG_COMM_RECV_STREAM检查逻辑连接状态,或检查网络状态。 |
| wait producer ready | 初始化stream flow时,等待每个producer都准备好,当前正在等待nodename节点plevel对应线程的producer对象准备好,且仍有N个producer对象处于等待状态。 | stream consumer等待producer完成执行并接收其发送的数据。 | 检查网络状态,或降低业务量。 |
| synchronize quit | stream plan结束时,等待stream线程组内的线程统一退出。当wait_status中显示形如“synchronize quit, total m, remain n”的内容时,表示共有m个并发任务,其中仍存在n个并发任务未处于统一退出状态。 | 等待stream线程组内的线程统一退出。 | stream计划和smp计划的SQL均会出现该等待事件,可通过增加非stream计划的hint或关闭enable_stream_operator功能规避。 |
| wait stream group destroy | 等待销毁stream node group。 | stream plan结束时,等待销毁stream node group。 | stream计划和smp计划的SQL均会出现该等待事件,可通过增加非stream计划的hint或关闭enable_stream_operator功能规避。 |
| wait stream thread ready | stream producer阻塞,直至其线程id被成功设置。 | stream producer未成功刷新线程id。 | stream计划和smp计划的SQL均会出现该等待事件,可通过增加非stream计划的hint或关闭enable_stream_operator功能规避。 |
| wait create stream thread | 等待stream线程启动。 | 由于资源上限等原因,等待stream线程启动。 | stream计划和smp计划的SQL均会出现该等待事件,可通过增加非stream计划的hint或关闭enable_stream_operator功能规避。 |
| wait active statement | 等待作业执行,正在资源负载管控中。 | 超过并发上限。 | 减少并发操作。 |
| wait memory | 等待内存获取。 | 有线程处于等待mem状态 | - |
| Sort | 当前是Sort算子做排序。 | 1.查询的数据量大; 2.计划不合理,如过滤条件没有下推。 | 尝试更改SQL语句调整执行计划。 |
| Sort - fetch tuple | 当前是Sort算子做排序,fetch tuple表示Sort算子正在获取tuple。 | 1.查询的数据量大; 2.计划不合理,比如大小表Join的顺序不合理。 | 尝试更改SQL语句调整执行计划。 |
| Sort - write file | 当前是Sort算子做排序,write file表示Sort算子正在将数据写入磁盘。 | 1.查询的数据量大; 2.计划不合理,如过滤条件没有下推; 3.由于内存设置较小,或其他线程占用,导致当前业务线程内存不够。 | 1.尝试更改SQL语句调整执行计划; 2.调大内存。 |
| Material | 当前是Material算子。 | 1.查询的数据量大; 2.计划不合理,比如过滤条件没有下推。 | 1.尝试更改SQL语句调整执行计划; 2.调大内存。 |
| Material - write file | 当前是Material算子,write file表示Material算子正在将数据写入磁盘。 | 1.查询的数据量大; 2.计划不合理,如过滤条件没有下推; 3.由于内存设置较小,或其他线程占用,导致当前业务线程内存不够。 | 1.尝试更改SQL语句调整执行计划; 2.调大内存。 |
| HashJoin - build hash | 当前是HashJoin算子,主要关注耗时的执行阶段。
| 1.查询的数据量大; 2.计划不合理,比如大小表Join的顺序不合理。 | 尝试更改SQL语句调整执行计划,添加对应的索引,加快Hash Join构建内表Hash table的速度。 |
| HashJoin - write file | 当前是HashJoin算子,主要关注耗时的执行阶段。
| 1.查询的数据量大; 2.计划不合理,如大小表Join的顺序不合理; 3.由于内存设置较小,或其他线程占用,导致当前业务线程内存不够。 | 1.尝试更改SQL语句调整执行计划; 2.调大内存。 |
| HashAgg - build hash | 当前是HashAgg算子,主要关注耗时的执行阶段。
| 1.查询的数据量大; 2.计划不合理,比如大小表Join的顺序不合理。 | 1.尝试更改SQL语句调整执行计划; 2.调大内存。 |
| HashAgg - write file | 当前是HashAgg算子,主要关注耗时的执行阶段。
| 1.查询的数据量大; 2.计划不合理,比如大小表Join的顺序不合理; 3.由于内存设置较小,或其他线程占用,导致当前业务线程内存不够。 | 1.尝试更改SQL语句调整执行计划; 2.调大内存。 |
| HashSetop - build hash | 当前是HashSetop算子,主要关注耗时的执行阶段。
| 1.查询的数据量大; 2.计划不合理,比如大小表Join的顺序不合理。 | 尝试更改SQL语句调整执行计划。 |
| HashSetop - write file | 当前是HashSetop算子,主要关注耗时的执行阶段。
| 1.查询的数据量大; 2.计划不合理,比如大小表Join的顺序不合理; 3.由于内存设置较小,或其他线程占用,导致当前业务线程内存不够。 | 1.尝试更改SQL语句调整执行计划; 2.调大内存。 |
| create index | 当前正在创建索引。 | 创建索引。 | 尽量避免在非关键列或区分性较低的列建立索引。 |
| analyze | 当前正在对表relname执行analyze。如果状态包含phase信息,则为autovacuum,表示是数据库自动开启AutoVacuum线程执行的analyze分析操作。 | 触发autoanalyze或用户手动下发的analyze。 | 调整default_statistics_target减小采样率,或调高autovacuum_analyze_scale_factor和autovacuum_analyze_threshold,减少analyze的触发间隔。 |
| vacuum | 当前正在对表relname执行vacuum。如果状态包含phase信息,则为autovacuum,表示是数据库自动开启AutoVacuum线程执行的vacuum清理操作。 | 执行vacuum或analyze。 | 取消vacuum或analyze操作,对于autovacuum线程,可通过减少页面并发DML实现。 |
| vacuum full | 当前正在对表relname执行vacuum full清理。 | 执行vacuum full。 | 避免对表执行重复无效的update操作,导致表膨胀。 |
| vacuum gpi | vacuum或autovacuum流程中对分区表global partition index清理。 | 分区表上有GPI索引,执行过分区表DDL后,GPI索引产生的死元组依赖autovacuum/vacuum做异步清理。 | 减少分区表DDL频率,或者使用local索引。 |
| gtm connect | 等待与GTM建连。 | 正在与GTM建连。 | 检查GTM和网络状态。 |
| gtm get csn | 等待从GTM获取csn。 | 事务commit时从GTM获取csn。 | 检查GTM和网络状态。 |
| gtm get snapshot | 等待从GTM获取事务快照snapshot。 | 事务commit时从GTM获取snapshot。 | 检查GTM和网络状态。 |
| gtm create sequence | 等待GTM创建sequence。 | 正在发消息给GTM创建sequence。 | 检查GTM和网络状态。 |
| gtm alter sequence | 等待GTM修改sequence。 | 正在发消息给GTM修改sequence。 | 检查GTM和网络状态。 |
| gtm get sequence val | 等待从GTM获取sequence的下一个值。 | 正在发消息给GTM获取sequence | 检查GTM和网络状态。 |
| gtm set sequence val | 等待GTM设置sequence的值。 | 正在发消息给GTM设置sequence。 | 检查GTM和网络状态。 |
| gtm drop sequence | 等待GTM删除sequence。 | 正在发消息给GTM删除sequence。 | 检查GTM和网络状态。 |
| gtm rename sequence | 等待GTM重命名sequence。 | 正在发消息给GTM重命名sequence。 | 检查GTM和网络状态。 |
| gtm set disaster cluster | 等待在GTM设置容灾集群的静态配置信息。 | 搭建容灾集群,主集群和容灾集群倒换;或GTM通信异常。 | 正常情况时间小于1s,若长时间处于此等待事件,需检查GaussDB与GTM通信是否异常。 |
| gtm get disaster cluster | 等待从GTM获取容灾集群的静态配置信息。 | 搭建容灾集群,主集群和容灾集群倒换,主集群节点的拓扑结构发生变化;或GTM通信异常。 | 正常情况时间小于1s,若长时间处于此等待事件,需检查GaussDB与GTM通信是否异常。 |
| gtm del disaster cluster | 等待在GTM删除容灾集群的静态配置信息。 | 搭建容灾集群,主集群和容灾集群倒换;或GTM通信异常。 | 正常情况时间小于1s,若长时间处于此等待事件,需检查GaussDB与GTM通信是否异常。 |
| gtm set standby read info | 等待GTM写入备机读信息。 | 备机从gtm中读取csn信息以及commit time时。 | 检查GTM和网络状态。 |
| gtm get standby read info | 等待从GTM获取备机读信息。 | 备机从gtm中获取上次信息。 | 检查GTM和网络状态。 |
| gtm set target standby info | 新特性预留。 | 新特性预留。 | 新特性预留。 |
| gtm get target standby info | 新特性预留。 | 新特性预留。 | 新特性预留。 |
| gtm reset standby read csn | 新特性预留。 | 新特性预留。 | 新特性预留。 |
| wait sync consumer next step | 消费者等待下一次迭代。 | RecursiveUnion算子执行过程中,等待下一次迭代的数据;仅在分布式下会出现。 | 设置enable_stream_recursive=off。 |
| wait sync producer next step | 生产者等待下一次迭代。 | RecursiveUnion算子对应的生产者执行过程中,等待下一次迭代的开始;仅在分布式下会出现。 | 设置enable_stream_recursive=off。 |
| gtm set consistency point | 等待在GTM设置容灾集群的全局一致性快照。 | 容灾集群正常运行过程中,CN收集并计算一致性快照,上报给GTM。 | 正常情况时间小于1s,若长时间处于此等待事件,需检查GaussDB与GTM通信是否异常。 |
| wait sync bgworkers | 等待并行创建索引的子线程完成本地扫描和排序。 | 执行并行创建索引。 | 关闭并行创建索引。 |
| flush local buffer for GTT | 等待本地buffer刷脏完成。 | 等待本地buffer刷脏。 | 减少业务量,检查I/O性能。 |
| standby get snapshot | 并行回放备机读场景下等待获取快照。 | 并行回放模式下,备机上的查询在获取快照时,如果备机正在回放页面清理类日志,需要等相关的日志回放完成,否则可能会出现数据不一致的问题。 | 主机减少vacuum的执行频率,或者开启极致RTO回放模式。 |
| recovery conflict with lock | 备机回放八级锁日志与查询发生冲突,等待查询结束。 | 主机执行DDL。 | 主机减少DDL的执行频率。 |
| recovery conflict with snapshot | 备机回放页面清理日志与查询发生冲突,等待查询结束。 | 主机执行vacuum。 | 主机减少vacuum的执行频率。 |
| recovery conflict with tablespace | 备机回放删除tablespace日志与查询发生冲突,等待查询结束。 | 主机执行删除tablespace。 | 主机减少DDL的执行频率。 |
| recovery conflict with database | 备机回放删除database日志与查询发生冲突,等待查询结束。 | 主机执行删除database。 | 主机减少DDL的执行频率。 |
| recovery conflict with truncate | 备机回放文件truncate日志与查询发生冲突,等待查询结束。 | 主机执行vacuum产生的文件truncate日志。 | 主机减少vacuum的执行频率。 |
| recovery conflict with standby query timeout | 极致RTO备机读,查询超过时间阈值,查询取消。 | 查询超过最大执行时间。 | 减少查询的时间。 |
| recovery conflict with force recycle | 极致RTO备机读,发生强制回收,查询取消。 | 极致RTO备机读历史文件空间占用超过阈值。 | 调大GUC参数max_standby_base_page_size。 |
| recovery conflict with buffer pin | 回放线程在解决buffer pin类型的查询与回放冲突。 | 在数据库恢复过程与缓冲区锁定发生冲突。 | 优化缓冲区管理策略,减少恢复操作与缓冲区锁定的冲突。 |
| wait io control | 等待作业执行,正在I/O管控中。 | I/O操作被系统管控机制限制,如I/O资源配额或优先级控制。 | 检查和调整I/O管控策略,确保关键I/O操作能够及时执行。 |
| wait gs_sleep | 等待服务器线程延迟时间。 | 数据库内部的调度机制,用于控制线程的执行节奏。 | 检查数据库的配置参数,如是否有必要调整线程的调度策略。 |
| wait vacuum delay | 等待vacuum延迟时间。 | 自动vacuum进程延迟执行,或手动vacuum操作等待合适的执行窗口。 | 调整vacuum的执行策略,如增加自动vacuum的频率或在系统负载较低时执行。 |
| wait seq scan | seq scan执行时间。 | 数据库执行顺序扫描操作,由于缺乏索引或查询优化不足。 | 优化查询语句,增加适当的索引以减少全表扫描,提高查询效率。 |
| wait index scan | index scan执行时间。 | 数据库执行索引扫描操作,由于索引设计不当或查询条件不匹配索引。 | 检查索引的有效性和查询条件,优化索引结构,提高索引扫描效率。 |
| wait checkpoint start | checkpoint开始阶段时间。 | 数据库执行checkpoint操作的开始阶段,可能由于I/O性能瓶颈。 | 优化I/O性能,调整checkpoint的频率和时间,减少I/O等待。 |
| wait checkpoint done | checkpoint结束阶段时间。 | 数据库执行checkpoint操作的结束阶段,可能由于I/O性能瓶颈。 | 优化I/O性能,调整checkpoint的配置以减少等待时间。 |
| wait xact start command | xact开始时间。 | 事务开始阶段,由于事务日志瓶颈或锁等待。 | 优化事务日志的处理,减少事务开始的延迟。 |
| wait xact commit command | xact提交时间。 | 事务提交阶段,由于锁等待或事务日志瓶颈。 | 优化事务处理流程,减少锁竞争,提高事务日志处理效率。 |
| Accept client conn - Total Time | 等待客户端连接时间。 | 用于统计客户端连接时间。 | 减少业务并发。 |
| Accept client conn - ThrdPool - add epoll | 等待监听事件加入epoll。 | 用于统计加入监听事件。 | 减少业务并发。 |
| Accept client conn - ThrdPool - wait worker | 等待worker处理会话。 | 用于统计等待到worker的时间。 | 减少业务并发。 |
| Accept client conn - ThrdPool - init session | 等待会话初始化。 | 用于统计会话初始化时间。 | 减少业务并发。 |
| Accept client conn - Worker - init proc | 等待proc初始化。 | 用于统计proc初始化时间。 | 减少业务并发。 |
| Accept client conn - Worker - init session | 等待会话初始化。 | 用于统计会话初始化时间。 | 减少业务并发。 |
| security audit write pipe | 等待将审计日志写入管道。 | 安全审计日志系统在写入日志时遇到瓶颈。 | 优化审计日志系统,增加资源或调整审计策略,减少写入等待。 |
| wait ugin cleanup proc | 等待UGIN索引清空缓冲区。 | 正在清理UGIN索引缓冲区。 | 清理UGIN索引缓冲区时调用,适当减少gin_pending_list_limit大小。 |
| wait gin cleanup proc | 等待GIN索引清空缓冲区。 | 正在清理GIN索引缓冲区。 | 清理GIN索引缓冲区时调用,适当减少gin_pending_list_limit大小。 |
| wait fetch undo record | 等待读取目标UNDO记录。 | 事务同步或异步回滚时。 | 减少DML操作的事务abort。 |
| deadlock check | 等待死锁检测完成。 | 等锁时间超过死锁检测配置时间,触发死锁检测。 | 优化业务流程减少锁冲突,或增加deadlock_timeout避免频繁死锁检测。 |
| invalid wait event | 意料之外的等待事件。 | 发生了不应该发生的等待事件。 | 联系华为技术支持。 |
当wait_status为acquire lwlock、acquire lock或wait io时,表示有等待事件。正在等待获取wait_event列对应类型的轻量级锁、事务锁或者正在进行I/O操作。
其中,wait_status值为acquire lwlock(轻量级锁)时对应的wait_event等待事件类型与描述信息如表3所示。(wait_event为extension时,表示此时的轻量级锁是动态分配的锁,未被监控。)
| wait_event类型 | 类型描述 | 出现原因 | 调优建议 |
|---|---|---|---|
| OidGenLock | 用于避免不同线程产生相同的OID。 | 分配OID并发量大。 | 减少并发操作。 |
| XidGenLock | 用于避免两个事务获得相同的XID。 | 分配XID并发量大。 | 减少并发DDL、DML等操作。 |
| ProcArrayLock | 用于避免并发访问或修改ProcArray共享数组。 | 当前系统线程数量大。 | 减少并发线程数量。 |
| SInvalReadLock | 用于避免与清理失效消息并发执行。 | 读取失效队列的失效消息时,加读锁。 | 减少DDL执行频率,降低失效消息发送次数。 |
| SInvalWriteLock | 用于避免与其它写失效消息、清理失效消息并发执行。 | 插入失效队列的失效消息时,或对失效队列有非只读操作时,加写锁。 | 减少DDL执行频率,降低失效消息发送次数。 |
| WALBufMappingLock | 保护共享内存中各个WAL缓存页面与lsn偏移的映射关系,用于避免将记录插入未初始化的WAL文件。 | 插入记录与初始化WAL文件并发。 | 增大wal_buffers设置。 |
| WALWriteLock | 用于避免并发WAL写盘。 | 并发WAL文件写盘。 | 减少业务量,检查I/O性能。 |
| ControlFileLock | 用于避免pg_control文件的读写并发、写写并发。 | 数据库初始化,checkpoint、备份恢复、日志归档、主备同步等场景,并发访问pg_control文件。 | 减少并发访问pg_control文件。 |
| CheckpointLock | 用于避免多个checkpoint并发执行。 | 触发checkpoint。 | 减小并发。 |
| MultiXactGenLock | 用于串行分配唯一MultiXact id。 | 分配MultiXact id并发量大。 | 减少并发DML等操作。 |
| MultiXactOffsetControlLock | 用于避免对pg_multixact/offset的写写并发和读写并发。 | 对pg_multixact/offset并发量过大。 | 减小并发。 |
| MultiXactMemberControlLock | 用于避免对pg_multixact/members的写写并发和读写并发。 | 对pg_multixact/members并发量过大。 | 减小并发。 |
| RelCacheInitLock | 用于失效消息场景对init文件进行操作时加锁。 | 初始化relcache时,或失效relcache init file时,对init文件加锁。 | 避免频繁销毁创建线程。 |
| CheckpointerCommLock | 用于向checkpointer发起文件刷盘请求场景,需要串行的向请求队列插入请求结构。 | 脏页落盘、shrink、truncate操作等产生脏页后,收集sync请求。 | 减少此类操作的并发执行。 |
| TablespaceCreateLock | 用于确定tablespace是否已经存在。 | drop或创建表空间。 | 减少并发drop或create表空间。 |
| BtreeVacuumLock | 用于防止vacuum清理B-tree中还在使用的页面。 | 执行vacuum。 | 减少并行vacuum操作。 |
| AutovacuumLock | 用于串行化访问autovacuum worker数组。 | Autovacuum Launcher正在调度worker线程。 | 调整Autovacuum worker线程信息,无需调优。 |
| AutovacuumScheduleLock | 用于串行化分配需要vacuum的table。 | Autovacuum线程判断是否表需要清理。 | 减少Astore表的并发DML操作。 |
| AutoanalyzeLock | 用于获取和释放允许执行Autoanalyze的任务资源。 | 在生成计划时,如果基表没有收集过统计信息,则会进行自动收集。单个节点只允许同时存在10个线程进行自动统计信息收集。本轻量锁用于控制统计信息自动收集的资源分配。 | 如果本轻量锁存在大量冲突,说明业务库中长期大量存在reltuples/relpages为0的表,无需进行自动统计信息收集。可以关闭autoanalyze参数进行调优。 |
| SyncScanLock | 用于确定heap扫描时某个relfilenode的起始位置。 | 执行synchronized sequential scan。 | 减少并发扫描操作。 |
| BarrierLock | 用于保证当前只有一个线程在创建barrier。 | 有两个线程同时在创建barrier。 | 减少create barrier操作。 |
| NodeTableLock | 用于保护存放CN和DN节点信息的共享结构。 | 分布式扩容/缩容阶段,调用pgxc_pool_reload函数,对节点pool中缓存的集群拓扑结构进行刷新,需要加排他锁,此时分布式语句解析和执行阶段的读锁会被阻塞。 | 将集群扩容放在业务波谷期进行,减少业务冲突。 |
| PoolerLock | 用于保证两个线程不会同时从连接池里取到相同的连接。 | 加锁从连接池中获取连接。 | 通常情况下,业务稳定运行期间,不会触发此等待事件。如果频繁触发请降低业务量。 |
| AlterPortLock | 用于保护协调节点更改注册端口号的操作。 | 线程初始化时会进行端口号注册。 | 通常情况下,业务稳定运行期间,不会触发此等待事件。如果频繁触发请排查后台线程是否频繁拉起。 |
| RelationMappingLock | 用于等待更新系统表到存储位置之间映射的文件。 | 并发创建pg_filenode.map。 | 减少对pg_filenode.map的并发访问。 |
| SerializableXactHashLock | 用于避免对于可串行事务共享结构的写写并发和读写并发。 | 并发访问可串行事务。 | 减少并发访问可串行事务。 |
| SerializableFinishedListLock | 用于避免对于已完成可串行事务共享链表的写写并发和读写并发。 | 并发访问可串行事务。 | 减少并发访问可串行事务。 |
| SerializablePredicateLockListLock | 用于保护对于可串行事务持有的锁链表。 | 并发访问可串行事务。 | 减少并发访问可串行事务。 |
| OldSerXidLock | 用于保护记录冲突可串行事务的结构。 | 并发访问可串行事务。 | 减少并发访问可串行事务。 |
| FileStatLock | 用于保护存储统计文件信息的数据结构。 | 存储读取文件时调用pgstat上报统计信息。 | 内置统计信息数组有固定大小,会很快达到限制,无需规避。 |
| SyncRepLock | 用于在主备复制时保护Xlog同步信息。 | 等待备机返回Xlog刷盘信息。 | 与主备间网络延迟,备机I/O性能相关。 |
| DataSyncRepLock | 用于在主备复制时保护数据页同步信息。 | 等待备机返回数据页刷盘信息。 | 关闭混合流复制功能enable_mix_replication。 |
| ExtensionConnectorLibLock | 1. 初始化ODBC连接场景,在加载与卸载特定动态库时进行加锁。(EC弃用) 2. 异构DBLINK用于初始化OCI连接场景,在加载与卸载OCI相关动态库时进行加锁。 | 使用异构DBLINK连接Oracle数据库。 | 不使用异构DBLINK。 |
| GTMHostInfoLock | 用于避免并发访问或者修改GTM主机信息。 | 并发访问GTM主机。 | 检查GTM和网络状态。 |
| ReplicationSlotAllocationLock | 用于主备复制时保护主机端的流复制槽的分配。 | 创建或者清理复制槽,修改复制槽状态。 | 仅创建或者清理复制槽,修改复制槽状态时会调用,无需调优。 |
| ReplicationSlotControlLock | 用于主备复制时避免并发更新流复制槽状态。 | 修改复制槽状态。 | 仅修改复制槽状态时会调用,无需调优。 |
| FullBuildXlogCopyStartPtrLock | 控制全量build起点位置的并发访存,用于保护全量build中Xlog复制的操作。 | 全量build。 | 用于build操作,无需调优。 |
| LogicalReplicationSlotPersistentDataLock | 控制逻辑复制槽持久化的并发顺序,用于保护逻辑复制过程中修改逻辑复制槽位的数据。 | 逻辑复制槽数据需要修改。 | 仅修改逻辑复制槽数据时需要调用,无需调优。 |
| ResourcePoolHashLock | 用于避免并发访问或者修改资源池哈希表。 | 读取或更新资源池哈希表时会申请锁。 | 增删查改资源池时会申请该锁,业务高峰期也会频繁申请该锁,可以减少此两种操作,降低锁等待的可能。 |
| WorkloadCGroupHashLock | 用于避免并发访问或者修改Cgroup信息构成的哈希表。 | 读取或更新Cgroup信息哈希表时会申请锁。 | 减轻业务压力。 |
| OBSGetPathLock | 用于避免对obs路径的写写并发和读写并发。 | - | - |
| WorkloadUserInfoLock | 用于避免并发访问或修改负载管理的用户信息哈希表。 | 读取或更新负载管理用户信息哈希表时会申请锁。 | 减轻业务压力。 |
| WorkloadIOUtilLock | 用于保护记录iostat、CPU等负载信息的结构。 | 读取或更新IOSTAT、CPU等负载信息时会申请锁。 | 减轻业务压力。 |
| WorkloadNodeGroupLock | 用于避免并发访问或者修改内存中的nodegroup信息构成的哈希表。 | 读取或更新nodegroup信息时会申请锁。 | 减轻业务压力。 |
| JobShmemLock | 用于MPP兼容ORACLE定时任务功能中保护定时读取的全局变量。 | 定时任务scheduler线程与worker线程访问定时任务列表的锁。 | 关闭定时任务。 |
| OBSRuntimeLock | 用于获取环境变量,如GASSHOME。 | - | - |
| LLVMDumpIRLock | 用于导出动态生成函数所对应的汇编语言。 | 开启enable_codegen_print参数后,触发codegen执行时会出现该等待事件。 | 设置enable_codegen_print=off(默认为off,通常在问题定位时才开启)。 |
| LLVMParseIRLock | 用于在查询开始时,从IR文件中编译并解析预先编译好的IR函数。 | 查询触发codegen执行时,会出现该等待事件,通常等待时间非常短暂。 | 设置enable_codegen=off。 |
| RPNumberLock | 已废弃。 | 已废弃。 | 已废弃。 |
| ClusterRPLock | 已废弃。 | 已废弃。 | 已废弃。 |
| WaitCountHashLock | 用于保护用户语句计数功能场景中的共享结构。 | 在更新或查询等待计数哈希表时,可能因锁竞争而导致等待。 | 优化等待计数哈希表的访问逻辑,减少锁竞争,或者优化查询性能。 |
| InstrWorkloadLock | 保护负载管理统计信息的内存hash表访问。 | 读取或更新workload事务统计信息的哈希表时会申请锁。 | 可以通过GUC参数enable_resource_track关闭workload事务统计功能。 |
| CBMParseXlogLock | cbm解析Xlog时的保护锁,控制cbm文件的并发访存。 | 有两个线程在同时使用该锁。 | 重试该操作。 |
| DelayDDLLock | 控制删除类DDL和延迟备份功能的并发顺序。 | 调用了延迟DDL的操作。 | 等待延迟DDL操作完成后,执行disable delay DDL操作。 |
| BadBlockStatHashLock | 保护共享损坏页面统计哈希表的并发访存。 | 在更新或查询坏块统计信息时,可能因锁竞争而导致等待。 | 优化对坏块统计信息的访问频率,减少锁竞争,或者增加处理坏块的并行度。 |
| RowPageReplicationLock | 控制行存页面复制的并发顺序,用于管理行存储的数据页复制。 | - | - |
| RcvWriteLock | 控制wal receiver writer的并发顺序,防止并发调用WalDataRcvWrite。 | 写入WAL数据。 | 减少业务量,检查I/O性能。 |
| InstanceTimeLock | 保护全局变量g_instance.stat_cxt.gInstanceTimeInfo,用于统计节点级别时间模型。 | 刷新或读取节点级别时间模型信息。 | 节点级别时间模型指标统计,无需规避。 |
| PercentileLock | 用于保护全局percentileBuffer。 | 读取或更新percentile统计数据或结果的全局缓存时会申请锁。 | 关闭percentile功能或适当增大计算周期。 |
| XlogRemoveSegLock | 控制最新删除WAL文件信息的并发访存,保护Xlog段文件的回收操作。 | 回放checkpoint的Xlog。 | 减少checkpoint。 |
| DnUsedSpaceHashLock | 用于更新会话对应的空间使用信息。 | 读取或更会话对应的空间使用信息哈希表时会申请锁。 | 减少会话。 |
| CsnMinLock | 控制csn min信息的并发访存。 | 当前系统线程数量大。 | 减少并发线程数量。 |
| GPCClearLock | 用于保护全局Plan Cache hash表的清除操作。 | GPC清理待淘汰计划。 | 属于GPC正常清理取锁操作。可通过视图dbe_perf.global_plancache_clean手动清理,或关闭enable_global_plancache功能。 |
| CaptureViewFileHashLock | 开启性能视图采集时,保护哈希表的并发访存。 | 同时对多个不同的表进行采集。 | 主要用于慢SQL定位使用,无需规避。 |
| UndoZoneLock | 锁定UndoZone的bitmap,保护undoZone的并发访存。 | 每个业务线程需要分配一个UndoZone,UndoZone的分配通过bitmap来管理。分配时需要对bitmap加锁来确保每个线程都分配到了不同的UndoZone。 | 减少对Ustore表的DML操作的并发数。 |
| RollbackReqHashLock | 对异步回滚哈希表加锁,管理共享内存中存储回滚请求信息的哈希表的并发访存。 | 异步回滚机制在后台执行回滚,不影响用户继续执行其他语句。异步回滚时需先添加异步回滚任务到一个任务哈希表中。对哈希表操作时需加锁以防止并发问题。 | 尽量减少回滚事务。 |
| HypoIndexLock | 虚拟索引创建、删除、重置等动作中使用的轻量级锁。 | 避免多会话下global级别虚拟索引的并发增删导致地址访问异常等。 | 默认不开启,该特性在SQL调优阶段使用,不影响数据库性能。 |
| WALWritePaxosLock | 保护向paxos复制组件写wal日志的并发顺序。 | 避免多线程并发写导致Xlog错乱。 | 一般只有Xlog刷盘线程调用无并发、WAL BUF满等情况下会有线程临时调用需要该锁保护,不影响性能。 |
| BlockchainVersionLock | 账本数据库中控制全局区块号的并发读写。 | 在账本数据库的防篡改表特性中,为了保证全局区块表区块号的唯一性,需要在每一条记录生成的时候加锁生成递增的区块号。 | 为避免频繁对账本表进行增删改操作,可以根据业务需求调整防篡改表的范围,并采用分库策略以降低对全局区块表的并发修改。 |
| GlobalPrevHashLock | 账本数据库中控制全局校验哈希的并发读写。 | 在账本数据库的防篡改表特性中,为了保证全局区块表的记录能够与上一行生成链式篡改校验信息,需要在每条记录生成时加锁来生成连续的哈希值,加锁机制可以保证并发写入的安全性。 | 为避免频繁对账本表进行增删改操作,可以根据业务需求调整防篡改表的范围,并采用分库策略以降低对全局区块表的并发修改。 |
| PldebugLock | 用于存储过程调试功能中锁处理操作。 | pldebugger进行turnon、turnoff时加锁。 | - |
| LocalBarrierBufferLock | 控制本地barrier文件修改,避免并发更新。 | 同时对本地barrier进行更新。 | 等待正在更新的操作执行完成。 |
| RoleIdLock | 控制pg_user_status系统表的并发读写。 | 提供密码保护策略。用户使用错误密码登录时,会更新系统表pg_user_status,记录失败次数和更新锁定状态。保证数据库账户安全。 | 使用错误密码登录是不安全的行为,可能是密码被修改,但用户未能感知;或者存在恶意用户不断尝试数据库密码。数据库管理员可定期检查所有用户的锁定状态,并分析被锁定账户,减少错误密码登录的次数,有以下几种情况: 1. 数据库遭受恶意攻击:管理员应及时分析原因,找出攻击源并采取相应措施。 2. 密码被修改但用户未察觉:提醒用户及时更新密码,以确保账户安全。 |
| InstrStmtTrackCtlLock | 在动态开启全量SQL时, 保护哈希表的并发访存。 | 动态抓取FullSQL场景中,高频率对不同uniqueQueryId进行track,或是对同一uniqueQueryId频繁track和untrack。 | 主要用于慢SQL定位使用,无需规避。 |
| HashUidLock | 保护Uid的增删改查。 | 访问带有用户的表。 | - |
| ParallelDecodeLock | 并行解码分配全局槽位用锁,保护并行解码的并发顺序。 | 使用并行解码。 | 减少并行解码业务的启动。 |
| XLogMaxCSNLock | 保护容灾模式下本地最大可恢复CSN信息。 | 当前系统线程数量大。 | 减少并发线程数量。 |
| DisasterCacheLock | 容灾集群节点映射表的锁,保护共享内存中容灾信息缓存的并发访存。 | 搭建容灾集群,主集群和容灾集群倒换,主集群节点的拓扑结构发生变化,重新创建节点映射关系。 | 正常场景,无需调优。 |
| MaxCSNArrayLock | 保护共享内存中各个分片备机CSN恢复进度信息。 | 容灾读引入。 | - |
| RepairBadBlockStatHashLock | 保护共享内存中损坏页面哈希表的并发访存。 | CRC损坏/LSN损坏页面被检测到,记录页面损坏信息。 | 避免产生坏块。 |
| ReplicationOriginLock | 发布订阅创建、删除、变更状态用锁。 | 使用发布订阅。 | 减少发布订阅功能的启动。 |
| LogicalRepWorkerLock | 发布订阅后台回放线程启动、停止、关联槽位用锁。 | 使用发布订阅。 | 减少发布订阅功能的启动。 |
| XGBoostLibLock | DB4AI特性调用xgboost库时启用的锁。 | xgboost开源库与openElur系统不兼容,需要动态调用库。dlopen加载时需要加锁。 | xgboost库的加载属于特殊事件的被动调用。在未进行DB4AI相关操作(如创建模型、执行预测任务等)时,该锁不会影响数据库性能。 |
| NgroupDestoryLock | 对于保护nodegroup哈希表并发修改加锁。 | pgxc_pool_reload等操作清空整个哈希表时加X锁,与其他S锁互斥发生等待事件。 | 仅在进行pgxc_pool_reload或其他涉及nodegroup操作时会出现,其他场景不会发生此等待事件。 |
| SQLAdvisorLock | 用于管理分布列推荐中hash表的并发访存。 | - | - |
| AuditIndexFileLock | 控制审计日志index文件的并发读写。 | 审计日志的管理依赖于内存中审计索引信息。审计线程中审计日志的老化和轮转,会更新索引信息,worker线程进行审计查询或删除过程会触发读取索引信息。加锁是为了索引信息更新或读取的正确性。 | 正常情况下,当触发审计查询、删除时才会出现审计索引信息读写的临界区。出现长时间等锁时,可以先停止执行审计的查询或删除,或者通过GUC参数开关控制产生审计日志的速度。 |
| GsStackLock | 控制gs_stack函数不被并发调用。 | 防止gs_stack并发调用。 | 使用gs_stack时才会申请该锁,不使用gs_stack则对性能无影响,无需规避。 |
| DropArchiveSlotLock | 保护删除归档槽信息的并发顺序。 | 同时对归档槽进行并发操作。 | 重试该操作。 |
| AboCacheLock | 控制ABO多列智能统计信息模型缓存的并发读写。 | 在进行多列智能统计信息模型训练与调用时会尝试缓存并读取已缓存模型以优化性能。需要加锁保证模型读取的正确性。 | 设置enable_ai_stats = off。 |
| DistributeDecodeSlotLock | 分布式逻辑解码的复制槽的创建互斥。 | 使用分布式逻辑解码,并发。 | - |
| ExrtoSnapshotLock | 极致RTO备机读快照锁。 | 正常回放生成快照会持有该锁,回放DDL日志取消查询时,可能持有的时间比较长。 | 主机减少DDL的执行频率。 |
| LocalBarrierRecordFlushLock | 将内存中的barrier信息刷盘。 | 同时调用了barrier刷盘的操作。 | 等待正在刷盘的操作执行完成。 |
| ClogTruncateLock | 控制clog文件删除和读写并发的锁。 | 避免clog文件删除和读写并发错误。 | - |
| RedoTruncateLock | 回放truncate文件时使用的锁。 | 避免checkpoint和truncate并发。 | DDL操作频率低对性能影响较小。 |
| SysToastOidGeneratorLock | 细粒度恢复时,如果涉及toast表,用来生成toast表的oid信息。 | 同时调用了impdp table操作。 | 等待细粒度恢复结束。 |
| RedoStatisticLock | 回放dfx统计数据锁。 | 避免查询和修改并发。 | - |
| DisasterCSNInfoListLock | 极致RTO容灾读csn和lsn映射表的锁。 | 回放barrier日志时会生成csn和lsn的映射。 | 不会出现持锁很长的时间,轻量的操作。 |
| WorkloadRuleLock | workload锁,避免并发操作。 | 读写workload资源时加锁。 | 减少业务并发。 |
| AcmFeedbackLock | 控制反馈基数估计模型算子收集相关全局变量的并发读写。 | 在收集算子与模型训练时需要维护收集的算子链表与算子数量的全局信息,需要加锁保证信息正确。 | 设置enable_adaptive_cost = off。 |
| AcmFeedbackModelCacheLock | 控制ABO反馈基数估计模型缓存的并发读写。 | 在进行反馈基数估计模型训练与调用时通过缓存、尝试读取已缓存模型以优化性能,在进行该操作时需要加锁保证模型读取的正确性。 | 设置enable_adaptive_cost = off。 |
| AcmParameterLock | 控制智能代价估计模型训练更新时对全局变量的并发读写。 | 在进行训练与更新智能代价模型时需更新全局变量acm_trainer中的模型参数,需要加锁保证更新与读取正确。 | 设置enable_adaptive_cost = off。 |
| ArchiveTaskLock | 归档时,向归档任务队列中增删任务。 | 有多个归档任务同时向归档队列中增删数据。 | 等待下一次任务。 |
| TruncateFileLock | 备机回放truncate文件日志时持有的锁。 | 主机执行vacuum产生的文件truncate日志。 | 主机避免短时间内删除大量数据。 |
| TmpBarrierBufferLock | 清理、合并本地barrier。 | 有多个清理、合并本地barrier的操作。 | 等待本地barrier清理、合并结束。 |
| RedoBarrierBufferLock | 对内存中的barrier信息加锁更新。 | 读取或更新redo barrier中的信息。 | 等待更新完成。 |
| AdioToggleLock | AdioToggleLock是Adio特性开关时加写锁,pread_wrapper、pwrite_wrapper加共享锁。 | 开启Adio特性时与读写调用互斥。 | 非性能敏感的锁,无需优化。 |
| LedgerRepairLock | 账本数据库中控制归档和修复操作的并发执行。 | 加锁机制可以保证账本数据库归档和修复操作并发写入的安全性。 | 避免对账本表进行并发归档和修复操作。 |
| ConsistencyVerifyStatHashLock | 保护共享内存中用于数据-索引一致性校验条目登记的哈希表的并发访存。 | 执行数据-索引一致性校验。 | 避免发生数据索引不一致(如注入故障);避免并发执行数据-索引一致性校验。 |
| PreLogicalStandbyControlLock | 逻辑备系统函数执行并发控制,以及playback落盘并发控制。 | 物理转逻辑,或逻辑回放。 | 非性能敏感的锁,无需优化。 |
| LogicalStandbyMetaFlushLock | 物理转逻辑准备解码元信息过程用于并发写控制。 | 物理转逻辑收集解码元信息。 | 非性能敏感的锁,无需优化。 |
| LogicalStandbyMetaControlLock | 逻辑备元信息目录内容修改并发控制。 | 逻辑回放过程元信息维护并发控制。 | 非性能敏感的锁,无需优化。 |
| WALReceiverDieLock | walrcv退出锁。 | 避免在写入buffer时walrcv退出并发。 | 非性能敏感的锁,无需优化。 |
| TSDictionaryDefinitionLock | 词典系统表gs_ts_dict_definition的全局锁。 | 控制gs_ts_dict_definition系统表的读写互斥,保证读取词典内容的完整性和一致性。 | 减少对TokenWeight类型词典的并发ALTER TEXT SEARCH、gs_ts_dict_add_definition、缓存加载操作。 |
| RespoolBufferContextBlockLock | bufferpool锁。 | 读写bufferpool。 | 减少业务并发。 |
| ParallelBuildIdentifierLock | 并行build分配build id的锁。 | 开启并行build。 | 不会出现持锁很长的时间,轻量操作。 |
| ParallelBuildQueueLock | 并行build处理文件名队列的锁。 | 开启并行build。 | 不会出现持锁很长的时间,轻量操作。 |
| InstrStmtGstraceCtlLock | 控制gstrace注册跟踪函数时不被并发调用。 | 防止gstrace注册跟踪函数时被并发调用。 | 调用 gstrace 跟踪接口时才会申请该锁。无需规避。 |
| InstrStmtGstraceSQLCtlLock | 控制gstrace注册跟踪SQL不被并发调用。 | 防止gstrace注册跟踪SQL被并发调用。 | 调用 gstrace 注册SQL接口、以及注册了SQL在跟踪时才会申请该锁。无需规避。 |
| InconsistencyAlarmHashLock | 保护共享内存中用于数据-索引一致性校验条目登记的哈希表的并发访存。 | 执行数据-索引一致性校验。 | 避免发生数据索引不一致(如注入故障);避免并发执行数据-索引一致性校验。 |
| StackAddrToNameLock | 控制gs_stack将符号地址转换为符号名不被并发调用。 | 防止gs_stack将符号地址转换为符号名被并发调用。 | 调用gs_stack或perf火焰图功能时才会申请该锁,无需调优。 |
| BufMappingLock | 用于保护对共享缓冲映射表的操作。 | 缓冲区映射hash表的分区锁。 | 可以调整分区数,避免过多的冲突。 |
| BucketBufMappingLock | bucket扩容期间私有缓冲区分区锁。 | bucket扩容期间竞争私有缓冲区。 | 仅在扩容流程内部涉及,不影响业务,暂无调整手段。 |
| LockMgrLock | 用于保护常规锁结构信息。 | 获取常规锁时竞争写入主锁表。 | 调节GUC参数num_internal_lock_partitions。 |
| PredicateLockMgrLock | 用于保护可串行事务锁结构信息。 | 用于保护可串行事务锁结构信息。 | - |
| OperatorRealTLock | 用于避免并发访问或者修改记录算子级实时数据的全局结构。 | - | - |
| OperatorHistLock | 用于避免并发访问或者修改记录算子级历史数据的全局结构。 | 在更新或查询操作符历史时,可能因锁竞争而导致等待。 | 优化操作符历史信息的访问逻辑,减少锁竞争,或者优化查询性能。 |
| SessionRealTLock | 用于避免并发访问或者修改记录query级实时数据的全局结构。 | 读取或更新session实时统计信息的哈希表时会申请锁。 | 减少session数。 |
| SessionHistLock | 用于避免并发访问或者修改记录query级历史数据的全局结构。 | 读取或更新session历史统计信息的哈希表时会申请锁。 | 减少session数。 |
| InstanceRealTLock | 用于保护共享实例统计信息哈希表的更新操作。 | 读取或更新实例统计信息哈希表时会申请锁。 | 减轻业务压力。 |
| CSNBufMappingLock | 控制共享csnlog页面映射的并发访存。 | 并发访问csn页面。 | 减少并发事务数量。 |
| CLogBufMappingLock | 用于提交日志缓存管理。 | 用于提交日志缓存管理。 | - |
| UniqueSQLMappingLock | unique SQL统计信息存放在内存的unique SQL哈希表中,UniqueSQLMappingLock为LWLOCK用于保护该哈希表中数据。 | unique SQL统计信息存放在内存的unique SQL哈希表中,当前版本共有128个哈希分区。当一个分区中更新数据时,需对相应分区加S锁以避免更新过程中删除动作触发内存问题,此时若有新的语句模板落入该分区,需等待更新操作完成放锁后才可执行添加;当某语句模板需要加入哈希表或从哈希表中删除时,需对该分区加X锁避免对该分区、添加、删除、写入操作,此时此分区内语句信息任何操作需等待插入、删除完成后执行。出现UniqueSQLMappingLock等待事件可能有以下原因: 1. 高并发产生大量新语句模板; 2. 业务高并发时间段调用unique_sql重置函数reset_unique_sql()。 | 通常情况下,业务稳定运行期间不涉及增减语句模板,不会触发此等待事件,若频繁出现此等待事件,可考虑下列方法规避此: 1. 若观察到业务模型中有大量select in语句,可设置instr_unique_sql_combination_options = 'in_clause'。 原理:将select in()语句多参数情况进行归一,减少新生成语句模板数量,减少哈希表加X锁次数。 影响:原有select in()语句的unique_sql_id发生变化,若已对该类语句打过sql patch,需重新统计相应语句新的id并重新打patch。 2. 若等待事件由上述原因2引起(日志中频繁打印[UniqueSQL] clean unique sql finished.),在业务低谷期再执行reset_unique_sql。 原理:业务高峰期unique sql哈希表频繁更新,reset的删除操作会对哈希表加x锁,造成大规模阻塞,在低谷期做reset可减小加锁对业务的影响。 影响:无。 3. 若等待事件由上述原因2引起(日志中频繁打印[UniqueSQL] Auto-cleanup over, %d uniquesqls are recycled.),可调整enable_auto_clean_unique_sql = off或适当增大instr_unique_sql_count。 原理:关闭自动淘汰功能可避免运行过程中对哈希表加锁删除操作,适当调大instr_unique_sql_count可增大unique sql哈希表容量,减少自动淘汰发生频率。 影响:若关闭自动淘汰功能,待哈希表记满后不会再对新语句模板做记录,导致部分统计信息丢失(不影响已有模板继续记录);若增大instr_unique_sql_count,会增大unique_sql哈希表内存占用,需结合当前内存使用情况调整。 4. 若观察到大量业务频繁被UniqueSQLMappingLock阻塞,且不符合上述情况,采用兜底手段关闭unique sql功能,设置instr_unique_sql_count = 0。 原理:手动关闭unique sql功能,功能关闭后不再操作unique SQL哈希表,不会触发此等待事件。 影响:语句级别统计信息缺失,会影响问题定位。(full sql、asp、wdr report中sql statistics面板均依赖unique sql功能,关闭unique sql会同时影响上述功能使用。) |
| InstrUserLockId | 对保护用户登录或者退出登录哈希表并发修改加锁。 | 读取或更新用户登录、退出信息时对哈希表并发使用。 | 用户登录、退出或查询用户登录、退出信息时会申请该锁,可以减少使用用户或避免用户同时登录、退出,降低等待锁的可能。 |
| GPCMappingLock | 用于全局Plan Cache缓存管理。 | 获取、存入计划或计划失效清理取锁。 | 属于GPC执行过程中正常取锁操作。计划失效清理时写锁可能耗时较长,可降低DDL频率,或关闭enable_global_plancache功能。 |
| ProcXactMappingLock | 保护事务号-线程信息映射哈希表的并发访存。 | 当前系统线程数量大。 | 减少并发线程数量。 |
| ASPMappingLock | 用于管理ASP的hash表的并发访存。 | ASP中拿取uniqueSQL中数据。 | ASP中用于拿取uniqueSQL数据,无需规避。 |
| RecoveryXidMappingLock | 保护两阶段事务的恢复所需要的共享内存。 | 故障前存在已prepared事务。 | 减少进程重启前prepare commit事务。 |
| BufferIOLock | 保护共享缓冲区单个页面加载或淘汰的IO并发。 | 缓冲区映射hash表的访问锁。 | 减少并发对同一页面进行I/O操作。 |
| BufferContentLock | 保护共享缓冲区单个页面的读取、修改。 | 缓冲区页面内容锁。 | 减少并发读写同一页面。 |
| BucketBufferIOLock | bucket扩容期间私有缓冲区IO锁。 | bucket扩容期间竞争私有缓冲区。 | - |
| BucketBufferContentLock | bucket扩容期间私有缓冲区内容锁。 | bucket扩容期间竞争私有缓冲区。 | - |
| UndoPerZoneLock | 保护每个undoZone内信息的并发访存。 | 每个业务线程绑定一个UndoZone,更改UndoZone的元信息内容时,需要对UndoZone加锁,以防止业务线程和回收线程的并发修改产生问题。 | 减少对Ustore表的DML操作。 |
| UndoSpaceLock | 保护undoSpace的并发访存。 | 每个UndoZone绑定一个UndoSpace,用于管理物理文件。对UndoSpace的元信息内容进行更改时,需要对UndoSpace加锁,以防止业务线程和回收线程的并发修改产生问题。 | 减少对Ustore表的DML操作。 |
| PGPROCLock | 保护全局共享线程状态数组的并发访存。 | 新建连接以及连接退出分配proc资源,与快照获取之间锁冲突。 | 避免频繁建连。 |
| ReplicationSlotLock | 用于保护ReplicationSlot。 | 将复制槽持久化到磁盘。 | 后台任务无需调优。 |
| Async Ctl | 用于保护异步控制模块的共享内存结构。 | 确保多进程并发访问时的数据一致性。 | 减少并发操作。 |
| CLOG Ctl | 保护clog的并发访存。 | 每个节点更新事务状态信息都需要访问clog。 | 减少并发事务数量。 |
| CSNLOG Ctl | 保护csn log的并发访存。 | 每个节点事务提交需要将事务的csn更新到csn log里。 | 减少并发事务数量。 |
| MultiXactOffset Ctl | 保护multixact日志中事务id的偏移量的并发访存。 | 当多个事务同时操作一个元组时,需要分配出multixactid,并保留到日志中。 | 减少多个事务对同一个元组进行修改或加锁。 |
| MultiXactMember Ctl | 保护multixact日志中事务id的并发访存。 | 当多个事务同时操作一个元组时,需要分配出multixactid,并保留到日志中。 | 减少多个事务对同一个元组进行修改或加锁。 |
| OldSerXid SLRU Ctl | 保护序列化事务的共享内存。 | 当设置事务隔离级别为序列化时,多个事务同时对tuple进行修改。 | 减少序列化事务修改同一个tuple的场景。 |
| WALInsertLock | 用于避免与其它WAL插入操作并发执行。 | 插入WAL记录。 | 减少业务量,检查I/O性能。 |
| SnapshotBlockLock | 控制快照备份与页面刷盘的并发顺序。快照备份期间,阻塞双写页面落盘。 | 正在执行快照备份操作。 | 等待快照备份结束后执行。 |
| DoubleWriteLock | 用于双写的管理操作。 | 写双写文件。 | pagewriter个数和双写文件个数相等不再维护。 |
| DWSingleFlushFirstLock | 控制非段页式单页面双写文件的并发顺序。 | 写单写文件。 | 避免并发页面淘汰。 |
| DWSingleFlushSecondLock | 控制段页式单页面双写文件的并发顺序。 | 写单写文件。 | 避免并发页面淘汰。 |
| DWSingleFlushSecondBufTagLock | 控制段页式单页面双写文件的元信息并发访存。 | 写单写文件。 | 避免并发页面淘汰。 |
| RestartPointQueueLock | 增量检查点checkpoint redo推进锁并发控制回放过程的redo推进位置。 | 并发控制回放过程redo点推进位置。 | 减少主机checkpoint频率,减少恢复过程和按需回放并发访问。 |
| PruneDirtyQueueLock | 增量检查点下脏页队列清理锁。 | 避免恢复过程做检查点更新脏页尾位置和pagewriter主线程清理脏页队列冲突。 | - |
| UnlinkRelHashTblLock | 保护共享内存中待删除文件哈希表的并发访存。 | 删除表的所有物理文件。 | 减少DDL操作。 |
| UnlinkRelForkHashTblLock | 保护共享内存中待删除文件fork哈希表的并发访存。 | 删除指定fork的物理文件。 | 减少DDL操作。 |
| LWTRANCHE_ACCOUNT_TABLE | 控制备机账号锁定记录的hash表的并发读写。 | 提供密码保护策略,用户使用错误密码登录备机时,会更新hash表,记录失败次数和更新锁定状态并存放在系统内存中,达到最大失败次数后,会禁止该用户登录备机,保证数据库备机的安全。 | 调优建议:使用错误密码登录是不安全的行为,可能是密码被修改,但用户未能感知;或者存在恶意用户不断尝试数据库密码。数据库管理员可定期检查所有用户的锁定状态,并分析被锁定账户,减少错误密码登录的次数,有以下几种情况: 1)数据库遭受恶意攻击:管理员可通过日志分析登录的账号,找出攻击源并采取相应措施; 2)密码被修改但用户未察觉:提醒用户及时更新密码,以保障业务正常运行。 |
| MPFLLOCK | 回放完成且落盘的最大lsn。 | 更新回放完成且落盘的最大lsn。 | - |
| GlobalTempTableControl | 保护全局临时表的本地共享hash表。 | 插入、删除、修改、truncate、访问全局临时表。 | 减少全局临时表的DDL、DML并发操作。 |
| NGroupMappingLock | 用于保护nodegroup哈希表的单个分桶并发修改加锁。 | 插入或删除单个分桶内的nodegroup时加X锁,与其他加X锁或S锁场景互斥产生等待事件。 | 仅在进行涉及nodegroup操作时会出现,其他场景不会发生此等待事件。 |
| MatviewSeqnoLock | 用于维护增量物化视图功能中的mlog表seqno列。 | 定义增量物化视图时,会通过mlog表维护基表的增量数据。基表增量数据写入mlog表时会申请该锁。seqno字段保证写入的增量数据有唯一且递增的序列号(标记增量数据的顺序)。 | 定义增量物化视图时,基表增量数据写入mlog表会调用该锁。在某表IUD性能较为重要的场景下,应该避免对该表创建增量物化视图。 |
| IOStatLock | 用于资源管理IO统计信息哈希表并发维护操作。 | 读取或更新IO统计信息哈希表时会申请锁。 | 减少I/O操作。 |
| StandbyStmtHistLock | 主要用于备机FullSQL定位能力。 | 在慢SQL文件落盘时,保护standby_statement_history函数对变更的同一资源避免读越界。 | 主要用于慢SQL定位使用,无需规避。 |
| WALBufferInitWait | 保护WAL共享内存页面的初始化和刷盘顺序。 | 初始化WAL Buffer。 | 仅初始化时触发,无需调优。 |
| WALInitSegment | 保护WAL日志段文件的初始化顺序。 | Xlog预初始化。 | 仅初始化时触发,无需调优。 |
| SegmentHeadPartitionLock | 保护段页式segment头部元信息的分区锁。 | 段页式对象的extent发生变化时,需要锁住segment header防止并发产生异常。 | - |
| TwoPhaseStatePartLock | 保护(各个分区)两阶段事务状态信息。 | 保护(各个分区)两阶段事务状态信息。 | - |
| RoleIdPartLock | 保护进程角色Id的增删查。 | 线程池模式下对进程角色Id增删查。 | - |
| GPRCMappingLock | 用于管理自治事务全局缓存哈希表的访问和修改操作。 | 高并发自治事务session场景,概率出现该锁等待事件。 | 减少自治事务session并发数量。 |
| PgwrSyncQueueLock | 保护待刷盘文件队列的并发访存。 | 增量checkpoint。 | 减少checkpoint频率。 |
| BarrierHashTblLock | 保护共享内存中barrier列表信息的并发访存。 | 对barrier_hash_table的并发访问,正常分布式容灾运行过程中,预解析线程解析barrier插入到hash表,回放线程回放完barrier日志后从hash表移除。 | - |
| PageRepairHashTblLock | 保护页面修复哈希表的并发访存。 | CRC损坏/LSN损坏页面被检测到,记录坏块。 | 避免产生坏块。 |
| FileRepairHashTblLock | 保护文件修复哈希表的并发访存。 | 发现文件损坏时,记录信息。 | 避免发生文件损坏。 |
| ReplicationOriginLock | 发布订阅创建、删除、变更状态用锁。 | 使用发布订阅。 | 减少发布订阅功能的启动。 |
| PCABufferContentLock | 跨页透明压缩特性,需要一个cache页面缓存cmap page,保护cache页面的一致性,功能类似于shared_buffer的 content lock。 | 为了保护cache页面的一致性。 | - |
| WALConsensusWait | 保护日志达成一致才进行事务提交或日志回放操作。 | 需要确保WAL日志在多个节点上达成共识,可能因为网络延迟或节点性能差异导致等待。 | 优化网络配置和节点性能,以减少WAL日志共识的时间,或者调整事务的提交策略以减少对共识机制的依赖。 |
| SegMappingLock | 保护段页式cache哈希表的并发访问。 | 段页式维护了一张哈希表,保存逻辑位置和物理位置的对应关系。哈希表存在并发访问的情况,需要加锁。 | - |
| PendingDelLock | 保护线程上的pendinglist并发修改。 | 事务中创建、删除、修改等操作过多时,pendinglist可能过长,操作pendinglist耗时可能较长。 | 减少事务中DDL操作的次数。 |
| AutonomousSessionLock | 用于自治事务建联时加锁。 | 高并发下保证自治事务顺序建联。 | 减少自治事务并发使用。 |
| CgroupHashLock | 用于防止并发初始化锁。 | 并发初始化。 | 减少并发业务。 |
| IMCVInfoHashTblLock | 用于保护htap存放全部imcvdesc的哈希表。 | 用于保护htap存放全部imcvdesc的哈希表。 | 使用分区表,构造多条gs_imcv,减少冲突。 |
| IMCVDescExpandLock | 用于保护单个IMCVDesc的并发安全。 | 用于保护单个IMCVDesc的并发安全。 | 减少并发加载COLVIEW操作。 |
| LogicalStandbyWalLock | 逻辑备拉取处理远端wal日志互斥。 | 使用逻辑回放。 | - |
| DelayDdlInfoLock | 备机进行延迟DDL持有的锁。 | 主机执行DDL。 | 主机减少DDL的执行频率。 |
| NvmeLSPosLock | 用于保护nvme哈希的4096个分区每个哈希分区的读写。 | 用来统计分区锁范围的时间,用以现网hang问题和性能问题定位。 | 调整索引结构分散热点页面分布。 |
| BucketWriterLock | bucket扩容期间私有缓冲区sync锁。 | bucket扩容期间竞争私有缓冲区。 | - |
| ClogBucketLock | 用于保护bucket clog控制文件。 | 大量bucket表业务并发扩展clog页面。 | - |
| BufFreelistLock | 已废弃。 | 已废弃。 | 已废弃。 |
| CUSlotListLock | 已废弃。 | 已废弃。 | 已废弃。 |
| ShmemIndexLock | 不涉及。 | 不涉及。 | 不涉及。 |
| CLogControlLock | 已废弃。 | 已废弃。 | 已废弃。 |
| SubtransControlLock | 已废弃。 | 已废弃。 | 已废弃。 |
| TwoPhaseStateLock | 已废弃。 | 已废弃。 | 已废弃。 |
| AddinShmemInitLock | 已废弃。 | 已废弃。 | 已废弃。 |
| AsyncCtlLock | 已废弃。 | 已废弃。 | 已废弃。 |
| AsyncQueueLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DataFileIdCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| CStoreColspaceCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| CStoreCUCacheSweepLock | 已废弃。 | 已废弃。 | 已废弃。 |
| MetaCacheSweepLock | 已废弃。 | 已废弃。 | 已废弃。 |
| FdwPartitionCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DfsConnectorCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| dummyServerInfoCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| SearchServerLibLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DfsUserLoginLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DfsSpaceCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| LsnXlogChkFileLock | 已废弃。 | 已废弃。 | 已废弃。 |
| WorkloadStatHashLock | 已废弃。 | 已废弃。 | 已废弃。 |
| WorkloadIoStatHashLock | 已废弃。 | 已废弃。 | 已废弃。 |
| WorkloadSessionInfoLock | 已废弃。 | 已废弃。 | 已废弃。 |
| WorkloadRecordLock | 已废弃。 | 已废弃。 | 已废弃。 |
| PgfdwLock | 已废弃。 | 已废弃。 | 已废弃。 |
| RelfilenodeReuseLock | 已废弃。 | 已废弃。 | 已废弃。 |
| GPCCommitLock | 已废弃。 | 已废弃。 | 已废弃。 |
| GPCTimelineLock | 已废弃。 | 已废弃。 | 已废弃。 |
| TsTagsCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| MaxPageFlushLsnFileLock | 已废弃。 | 已废弃。 | 已废弃。 |
| StreamingEngineConnLock | 已废弃。 | 已废弃。 | 已废弃。 |
| StreamingEngineExecLock | 已废弃。 | 已废弃。 | 已废弃。 |
| PartIdCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| PartOidCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DeleteCompactionLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DeleteConsumerLock | 已废弃。 | 已废弃。 | 已废弃。 |
| UHeapStatLock | 不涉及。 | 不涉及。 | 不涉及。 |
| ConsumerStateLock | 已废弃。 | 已废弃。 | 已废弃。 |
| SyncPaxosLock | 已废弃。 | 已废弃。 | 已废弃。 |
| BackgroundWorkerLock | 已废弃。 | 已废弃。 | 已废弃。 |
| HadrSwitchoverLock | 已废弃。 | 已废弃。 | 已废弃。 |
| UniqueSqlEvictLock | 不涉及。 | 不涉及。 | 不涉及。 |
| ExrtoRecycleResidualUndoLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DblinkFdwRelationLock | 已废弃。 | 已废弃。 | 已废弃。 |
| SPMGlobalLock | 不涉及。 | 不涉及。 | 不涉及。 |
| SlotsArrayLock | 已废弃。 | 已废弃。 | 已废弃。 |
| MtdStatusLock | 已废弃。 | 已废弃。 | 已废弃。 |
| AltLogicalMapClearLock | 不涉及。 | 不涉及。 | 不涉及。 |
| AltSnapTrackerXminLock | 不涉及。 | 不涉及。 | 不涉及。 |
| AltSnapTrackerCsnLock | 已废弃。 | 已废弃。 | 已废弃。 |
| OndemandQueueStatLock | 不涉及。 | 不涉及。 | 不涉及。 |
| AscendHashLock | 不涉及。 | 不涉及。 | 不涉及。 |
| CacheSlotMappingLock | 已废弃。 | 已废弃。 | 已废弃。 |
| LtxidMappingLock | 不涉及。 | 不涉及。 | 不涉及。 |
| UspagrpMappingLock | 已废弃。 | 已废弃。 | 已废弃。 |
| GlobalSeqLock | 已废弃。 | 已废弃。 | 已废弃。 |
| GlobalWorkloadLock | 已废弃。 | 已废弃。 | 已废弃。 |
| NormalizedSqlLock | 已废弃。 | 已废弃。 | 已废弃。 |
| StartBlockMappingLock | 已废弃。 | 已废弃。 | 已废弃。 |
| DataCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| MetaCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| GeneralExtendedLock | 已废弃。 | 已废弃。 | 已废弃。 |
| PLdebugger | 已废弃。 | 已废弃。 | 已废弃。 |
| GlobalCompilationProductHashTblLock | 不涉及。 | 不涉及。 | 不涉及。 |
| WALFlushWait | 已废弃。 | 已废弃。 | 已废弃。 |
| AuditIndextblLock | 已废弃。 | 已废弃。 | 已废弃。 |
| GlobalPlanCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| QueryPlanCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| SPMMappingLock | 不涉及。 | 不涉及。 | 不涉及。 |
| SPMGlobalInfoLock | 已废弃。 | 已废弃。 | 已废弃。 |
| AntiCacheLock | 不涉及。 | 不涉及。 | 不涉及。 |
| SQLFeedbackLock | 不涉及。 | 不涉及。 | 不涉及。 |
| IMCUDataCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| IMCUMetaCacheLock | 已废弃。 | 已废弃。 | 已废弃。 |
| IMCVDescLatch | 已废弃。 | 已废弃。 | 已废弃。 |
| WalRemoteWaitLock | 不涉及。 | 不涉及。 | 不涉及。 |
| AbnormalSQLMappingLock | 不涉及。 | 不涉及。 | 不涉及。 |
当wait_status值为wait io时对应的wait_event等待事件类型与描述信息如表4所示。
| wait_event类型 | 类型描述 | 出现原因 | 调优建议 |
|---|---|---|---|
| buffile_read | 等待从临时文件读取数据。 | 查询语句产生临时文件。 | 增大work_mem内存。 |
| buffile_write | 等待写临时文件。 | 查询语句产生临时文件。 | 增大work_mem内存。 |
| BufHashTableSearch | 共享缓冲区hash表搜索(可能会触发页面淘汰)。 | 从缓冲区查找指定buffer。 | 增大共享缓冲区大小,增加buffer命中率。 |
| buffer_strategy_get | 缓冲区替换策略中找到buffer耗时。 | 获取可用buffer。 | 减小checkpoint时间,pagewriter_sleep、bgwriter_delay时间,加快扫描缓存区的频率;减少并发。 |
| ControlFileRead | 读取pg_control文件。主要在数据库启动、执行checkpoint和主备校验过程中发生。 | 在数据库启动、执行checkpoint和主备校验过程中,从控制文件加载数据。 | 减少启停数据库、checkpoint、主备切换操作。 |
| ControlFileSync | 将pg_control文件持久化到磁盘。数据库初始化时发生。 | 数据库启动时,将pg_control文件中的数据落盘。 | 减少启停数据库。 |
| ControlFileSyncUpdate | 将pg_control文件持久化到磁盘。主要在数据库启动、执行checkpoint和主备校验过程中发生。 | 在数据库启动、执行checkpoint和主备校验过程中,将pg_control文件中的数据落盘。 | 减少启停数据库、checkpoint、主备切换操作。 |
| ControlFileWrite | 写入pg_control文件。数据库初始化时发生。 | 数据库启动时,会初始化控制文件,并写入磁盘。 | 减少启停数据库。 |
| ControlFileWriteUpdate | 更新pg_control文件。主要在数据库启动、执行checkpoint和主备校验过程中发生。 | 在数据库启动、执行checkpointer、主备校验过程中,需要将控制文件变更信息,写入pg_control文件。 | 减少启停数据库、checkpoint、主备切换操作。 |
| CopyFileRead | copy文件时读取文件内容。 | 由于文件I/O性能瓶颈或源文件被其他操作锁定。 | 优化I/O性能,或确保源文件未被其他操作长时间锁定,减少锁竞争。 |
| CopyFileWrite | copy文件时写入文件内容。 | 由于文件I/O性能瓶颈或目标文件被其他操作锁定。 | 优化I/O性能,或确保目标文件未被其他操作长时间锁定,减少锁竞争。 |
| DataFileExtend | 扩展文件时向文件写入内容。 | 触发扩展文件操作。 | 减少业务量,检查I/O性能。 |
| DataFileImmediateSync | 将表数据文件立即持久化到磁盘。 | 触发checkpoint。 | 调整checkpoint间隔并检查I/O性能。 |
| DataFilePrefetch | 异步读取表数据文件。 | 内存里缺少表数据文件信息,需要从磁盘加载。 | 调整shared_buffers大小并检查I/O性能。 |
| DataFileRead | 同步读取表数据文件。 | 内存里缺少表数据文件信息,需要从磁盘加载。 | 调整shared_buffers大小并检查I/O性能。 |
| DataFileSync | 将表数据文件的修改持久化到磁盘。 | 触发checkpoint。 | 调整checkpoint间隔并检查I/O性能。 |
| DataFileTruncate | 表数据文件truncate。 | 触发truncate操作。 | 减少对truncate表的并发操作。 |
| DataFileWrite | 向表数据文件写入内容。 | 触发checkpoint。 | 调整checkpoint间隔并检查I/O性能。 |
| SegFileExtend | 段页式文件扩展。 | 数据库在需要更多存储空间时会扩展段文件,由于文件系统性能限制会导致等待。 | 优化文件系统的I/O性能,或者预先分配足够的存储空间以减少扩展操作。 |
| SegReadDisk | 段页式文件读取。 | 数据库在访问数据时需要从磁盘读取段文件,由于I/O性能限制会导致等待。 | 优化存储设备的I/O性能,或者增加缓存以减少读取操作。 |
| SegWriteDisk | 段页式文件写入。 | 数据库在更新数据时需要写入段文件,由于I/O性能限制会导致等待。 | 优化存储设备的I/O性能,或者增加写入操作的并行度。 |
| SegSync | 段页式文件刷盘。 | 在数据修改后需要确保数据持久化,因此需要等待文件同步。 | 优化存储设备的I/O性能,或者调整同步操作的频率以减少等待时间。 |
| SegFileShrink | 段页式文件收缩。 | 数据库在释放不再需要的存储空间时会收缩段文件,由于文件系统性能限制会导致等待。 | 优化文件系统的I/O性能,或者减少段文件收缩操作的频率。 |
| LsnInfoPageDiskRead | 极致RTO备机读,读lsn info页面的I/O延迟。 | 开启极致RTO备机读。 | 增强I/O能力。 |
| BlkInfoMetaDiskRead | 极致RTO备机读,读block info页面的I/O延迟。 | 开启极致RTO备机读。 | 增强I/O能力。 |
| BasePageDiskRead | 极致RTO备机读,读base page页面的I/O延迟。 | 开启极致RTO备机读。 | 增强I/O能力。 |
| LockFileAddToDataDirRead | 读取"postmaster.pid"文件。 | 并发读取"postmaster.pid"文件。 | 减少并发业务。 |
| LockFileAddToDataDirSync | 将"postmaster.pid"内容持久化到磁盘。 | 并发持久"postmaster.pid"文件。 | 减少并发业务。 |
| LockFileAddToDataDirWrite | 将pid信息写到"postmaster.pid"文件。 | 并发写"postmaster.pid"文件。 | 减少并发业务。 |
| LockFileCreateRead | 读取LockFile文件"%s.lock"。 | 并发读取LockFile文件。 | 减少并发业务。 |
| LockFileCreateSync | 将LockFile文件"%s.lock"内容持久化到磁盘。 | 并发持久LockFile文件。 | 减少并发业务。 |
| LockFileCreateWRITE | 将pid信息写到LockFile文件"%s.lock"。 | 并发写LockFile文件。 | 减少并发业务。 |
| ReplicationSlotRead | 读取流复制槽文件。重新启动时发生。 | 读取复制槽持久化信息。 | 仅进程启动,加载复制槽信息时会调用,无需调优。 |
| ReplicationSlotRestoreSync | 将流复制槽文件持久化到磁盘。重新启动时发生。 | 从磁盘同步复制槽持久化信息。 | 仅进程启动,加载复制槽信息时会调用,无需调优。 |
| ReplicationSlotSync | checkpoint时将流复制槽临时文件持久化到磁盘。 | 将复制槽信息持久化到磁盘。 | 仅创建或者刷新复制槽状态时会调用,无需调优。 |
| ReplicationSlotWrite | checkpoint时写流复制槽临时文件。 | 将复制槽信息写入临时文件。 | 仅创建或者刷新复制槽状态时会调用,无需调优。 |
| SLRUFlushSync | 将pg_clog、pg_subtrans和pg_multixact文件持久化到磁盘。主要在执行checkpoint和数据库停机时发生。 | 触发checkpoint。 | 适当调小checkpoint间隔并检查I/O性能。 |
| SLRURead | 读取pg_clog、pg_subtrans和pg_multixact文件。 | 内存里缺少clog、csnlog信息,需要从磁盘加载。 | 适当调大shared_buffers大小并检查I/O性能。 |
| SLRUSync | 将脏页写入文件pg_clog、pg_subtrans和pg_multixact并持久化到磁盘。主要在执行checkpoint和数据库停机时发生。 | 触发checkpoint。 | 适当调小checkpoint间隔并检查I/O性能。 |
| SLRUWrite | 写入pg_clog、pg_subtrans和pg_multixact文件。 | 触发checkpoint。 | 适当调小checkpoint间隔并检查I/O性能。 |
| TwophaseFileRead | 读取pg_twophase文件。在两阶段事务提交、两阶段事务恢复时发生。 | 内存里缺少pg_twophase信息,需要从磁盘加载。 | 适当调大shared_buffers大小并检查I/O性能。 |
| TwophaseFileSync | 将pg_twophase文件持久化到磁盘。在两阶段事务提交、两阶段事务恢复时发生。 | 在两阶段事务期间,将脏页持久化到磁盘。 | 适当调小checkpoint间隔并检查I/O性能。 |
| TwophaseFileWrite | 写入pg_twophase文件。在两阶段事务提交、两阶段事务恢复时发生。 | 在两阶段事务期间,重建磁盘文件。 | 适当调小checkpoint间隔并检查I/O性能。 |
| UndoFileExtend | undo文件扩展。 | DML会产生undo记录,当空间不足时需要扩展undo文件,用于存储新的undo记录。 | 减少对Ustore表的DML操作。 |
| UndoFilePrefetch | undo文件异步读取。 | 当系统支持posix_fadvise()系统调用时,数据库会对扫描进行预读取以提升性能。 | 减少对Ustore表的DML操作。 |
| UndoFileRead | undo文件读取。 | 当业务需要访问元组历史版本,或者事务需要回滚时,会读取undo记录。 | 减少对Ustore表的DML操作。 |
| UndoFileWrite | undo文件写入。 | DML会产生undo记录,写undo记录会先写入缓冲区,然后在pagewriter线程中落盘。此等待事件产生在落盘流程。 | 减少对Ustore表的DML操作。 |
| UndoFileSync | undo文件同步落盘。 | 同步将undo记录落盘到磁盘。 | 减少对Ustore表的DML操作。 |
| UndoFileUnlink | undo文件删除。 | 每个Ustore表的DML操作均会产生undo记录,对无用的undo记录需要及时删除,以防undo空间不断膨胀。 | 减少对Ustore表的DML操作。 |
| UndoSegFileExtend | undo段页式文件扩展。 | DML会产生undo记录,当空间不足时需要扩展undo段页式文件,用于存储新的undo记录。 | 减少对Ustore表的DML操作。 |
| UndoSegReadDisk | undo段页式文件读取。 | 当业务需要访问元组历史版本,或者事务需要回滚时,会读取undo记录。 | 减少对Ustore表的DML操作。 |
| UndoSegWriteDisk | undo段页式文件写入。 | DML会产生undo记录,写undo记录会先写入缓冲区,然后在pagewriter线程中落盘。此等待事件产生在落盘流程。 | 减少对Ustore表的DML操作。 |
| UndoSegSync | undo段页式文件同步落盘。 | 同步将undo记录落盘到磁盘。 | 减少对Ustore表的DML操作。 |
| UndoMetaSync | undo元数据文件同步落盘。 | undo元数据会随着每轮checkpoint刷盘一次。确保checkpoint点更新之后,undo元数据的内容已经被实时持久化。 | 调大每轮增量checkpoint的时间间隔incremental_checkpoint_timeout。 |
| WALBootstrapSync | 将初始化的WAL文件持久化到磁盘。在数据库初始化发生。 | 初始化数据库。 | 仅初始化时触发,无需调优。 |
| WALBootstrapWrite | 写入初始化的WAL文件。在数据库初始化发生。 | 初始化数据库。 | 仅初始化时触发,无需调优。 |
| WALCopyRead | 读取已存在的WAL文件并进行复制时产生的读操作。在执行归档恢复完后发生。 | 执行归档恢复。 | 与I/O性能相关,可从硬盘优化。 |
| WALCopySync | 将复制的WAL文件持久化到磁盘。在执行归档恢复完后发生。 | 执行归档恢复。 | 与I/O性能相关,可从硬盘优化。 |
| WALCopyWrite | 读取已存在WAL文件并进行复制时产生的写操作。在执行归档恢复完后发生。 | 执行归档恢复。 | 与I/O性能相关,可从硬盘优化。 |
| WALInitSync | 将新初始化的WAL文件持久化磁盘。在日志回收或写日志时发生。 | 创建新的日志文件。 | 与I/O性能相关,可从硬盘优化。 |
| WALInitWrite | 将新创建的WAL文件初始化为0。在日志回收或写日志时发生。 | 创建新的日志文件。 | 与I/O性能相关,可从硬盘优化。 |
| WALRead | 从Xlog日志读取数据。两阶段文件redo相关的操作产生。 | 日志传输或逻辑解码操作。 | 与I/O性能相关,可从硬盘优化。 |
| ShareStorageWalRead | 共享盘读取日志文件。 | 共享存储WAL读取速度较慢,导致读取操作耗时。 | 优化网络和存储性能,或者增加WAL文件的读取并行度。 |
| ShareStorageWalWrite | 共享盘写入日志文件。 | 共享存储WAL写入速度较慢,导致写入操作耗时。 | 优化存储性能,或者调整WAL日志生成的配置以减少写入操作的等待。 |
| ShareStorageCtlInfoRead | 共享盘读取控制信息。 | 共享存储控制信息读取速度较慢,导致读取操作耗时。 | 优化存储性能,或者减少控制信息读取的频率。 |
| ShareStorageCtlInfoWrite | 共享盘写入控制信息。 | 共享存储控制信息写入速度较慢,导致写入操作耗时。 | 优化存储性能,或者减少控制信息写入的频率。 |
| WALSyncMethodAssign | 将当前打开的所有WAL文件持久化到磁盘。 | wal_sync_method参数变更。 | 与I/O性能相关,可从硬盘优化。 |
| WALWrite | 写入WAL文件。 | 写入Xlog文件。 | 与I/O性能相关,可从硬盘优化。 |
| WALBufferAccess | WAL Buffer访问(出于性能考虑,内核代码里只统计访问次数,未统计其访问耗时)。 | 插入WAL记录。 | 不统计耗时,无需调优。 |
| WALBufferFull | WAL Buffer满时,写WAL文件相关的处理。 | WAL Buffer满,等待下刷。 | 增大wal_buffers设置。 |
| DoubleWriteFileRead | 等待读取双写文件。 | 数据库启动阶段,扫描双写文件中的页面,对半写页面进行修复。 | 减少启停数据库,避免出现半写。 |
| DoubleWriteFileWrite | 等待写入双写文件。 | 触发checkpoint。 | 减少checkpoint操作。 |
| DWSingleFlushGetPos | 单页面双写文件查找可用位置。 | 增量检查点做全量checkpoint时,截断单写文件。 | 检查手动checkpoint操作。 |
| DWSingleFlushWrite | 单页面双写文件刷盘。 | 执行脏页淘汰的时候写单写文件。 | 减少页面淘汰,适当增加shared_buffers。 |
| CkptWaitPageWriterFlush | 执行全量checkpoint时等待刷页。 | 脏页刷新速度较慢,导致检查点操作受阻。 | 优化I/O性能,或增加写入器数量以提高写入效率。 |
| CkptWaitPageWriterSync | checkpoint打点前等待有修改的文件同步到磁盘。 | 脏页同步速度较慢,导致检查点操作受阻。 | 优化I/O性能,或调整检查点配置以减少同步操作的等待。 |
| CkptWaitCommitTransactionFinish | checkpoint打点前等待所有已经提交的事务提交完毕。 | 检查点需要等待所有活跃事务提交,以确保数据一致性。 | 优化事务处理流程,减少长事务,或者调整检查点的触发频率。 |
| PredoProcessPending | 并行日志回放中,当前记录回放等待其它记录回放完成。 | 出现需要等待同步的日志,如DDL相关日志。 | 减少DDL操作。 |
| PredoApply | 并行日志回放中,当前工作线程等待其他线程回放至本线程lsn。 | 出现需要等待同步的日志,如DDL相关日志。 | 减少DDL操作。 |
| DisableConnectFileRead | HA锁分片逻辑文件读取。 | HA build成功,同步主备配置文件。 | 与I/O性能相关,可从硬盘优化。 |
| DisableConnectFileSync | HA锁分片逻辑文件强制刷盘。 | HA build成功,同步主备配置文件。 | 与I/O性能相关,可从硬盘优化。 |
| DisableConnectFileWrite | HA锁分片逻辑文件写入。 | HA build成功,同步主备配置文件。 | 与I/O性能相关,可从硬盘优化。 |
| MPFL_INIT | 初始化max_page_flush_lsn。 | 初始化控制文件。 | 与I/O性能相关,可从硬盘优化。 |
| MPFL_READ | 读取max_page_flush_lsn。 | 读取控制文件。 | 与I/O性能相关,可从硬盘优化。 |
| MPFL_WRITE | 写入max_page_flush_lsn。 | 写入控制文件。 | 与I/O性能相关,可从硬盘优化。 |
| LOGCTRL_SLEEP | 等待备机回放追赶。 | 打开流控场景。 | 关闭流控。 |
| WALRcvBufFull | 备机walreceiver接收Xlog日志放到缓冲区过程,缓冲区已满时发生。 | WAL接收缓冲区容量不足,无法及时处理接收到的WAL日志。 | 与I/O性能相关,可从硬盘优化。 |
| WALFileSync | 将WAL文件持久化到磁盘。 | 在执行WAL写入操作后,需要确保数据持久化,因此需要等待文件同步。 | 与I/O性能相关,可从硬盘优化。 |
| VlogInitSync | 等待vlog文件初始化。 | 打开页面校验持久化后,创建新的vlog文件。 | 与I/O性能相关,可从硬盘优化。 |
| VlogWrite | 等待将vlog记录写入文件。 | 打开页面校验持久化后,将vlog记录写入文件。 | 与I/O性能相关,可从硬盘优化。 |
| OBSWrite | 已废弃。 | 已废弃。 | 已废弃。 |
| invalid io event | 意料之外的读写事件。 | 发生了不应该发生的读写事件。 | 联系华为技术支持。 |
当wait_status值为acquire lock(事务锁)时对应的wait_event等待事件类型与描述信息如表5所示。
| wait_event类型 | 类型描述 | 出现原因 | 调优建议 |
|---|---|---|---|
| relation | 对表加锁。 | 业务语句获取表锁冲突。 | 避免对同一个表并发DML和DDL。 |
| extend | 对表扩展空间时加锁。 | 频繁对同一个表扩展空间锁冲突。 | 避免对同一个表并发插入大量数据。 |
| partition | 对分区表加锁。 | 业务语句获取分区表锁冲突。 | 避免对同一个分区表并发DML和DDL。 |
| partition_seq | 对分区表的分区加锁。 | 业务语句获取分区表的分区表锁冲突。 | 避免对同一个分区表的分区并发DML和DDL。 |
| page | 对表页面加锁。 | 业务语句增删改向量元数据冲突。 | 减少对向量表向量列的并发DML。 |
| tuple | 对页面上的tuple加锁。 | 执行DML时会对tuple加锁。 | 减少并发DML操作。 |
| transactionid | 对事务id加锁。 | 并发访问相同事务。 | 减少并发访问相同事务。 |
| virtualxid | 对虚拟事务id加锁。 | 并发访问相同虚拟事务。 | 减少并发访问相同虚拟事务。 |
| object | 加对象锁。 | 数据库内部对象锁冲突。 | 分析具体流程代码。 |
| advisory | 加advisory锁。 | 调用咨询锁函数发生锁冲突,例如session1调用pg_advisory_lock_int8并长时间不放锁,session2调用pg_advisory_lock_int8同样参数就会进入等待状态。 | 优化业务流程,避免锁冲突。 |
| filenode | 对文件名加锁,控制文件级操作的并发顺序。 | 由于多个会话并发访问同一文件时,系统需要对文件加锁以控制并发顺序,防止数据冲突。 | 优化访问逻辑,减少对同一文件的并发操作。 |
| subtransactionid | 对子事务号加锁。 | 并发访问相同子事务。 | 减少并发访问相同子事务。 |
| tuple_uid | 对元组头部的uid隐藏字段加锁。 | 对Ustore表执行DML。 | 减少对Ustore表的并发DML操作。 |
| spectoken | 保护upsert过程。 | 事务里并发执行upsert。 | 避免事务并发执行upsert或者优化upsert性能。 |
| bucket | 加bucket锁。 | 业务语句获取bucket锁冲突。 | - |
| vector_ccbuild | 对索引的tuple加锁。 | 向量索引创建时会对索引的元组加锁。 | 减少并发创建操作。 |
| cstore_freespace | 已废弃。 | 已废弃。 | 已废弃。 |
| userlock | 已废弃。 | 已废弃。 | 已废弃。 |