PostgreSQL实例大量空闲会话拖慢SQL快照创建的机制咨询
PostgreSQL大量空闲会话拖慢快照创建的具体机制
活跃事务遍历的直接开销
创建快照时,PostgreSQL必须扫描全局共享内存中的ProcArray(进程数组),这个结构记录了所有当前连接会话的事务状态。如果存在大量处于idle in transaction(事务中闲置)状态的会话,它们的事务仍被标记为活跃,PostgreSQL需要逐个检查这些会话的事务信息,收集所有活跃事务ID(XID)。会话数量越多,这个遍历和信息收集的耗时就越长,直接拉长快照创建的时间。可见性计算的额外负载
快照的核心作用是帮事务判断数据的可见性——即哪些数据行对应的事务已经提交、哪些仍在活跃。大量活跃的空闲事务会让活跃XID的集合变得异常庞大,PostgreSQL在计算可见性时,需要将当前事务的XID与这个庞大的集合逐一对比,这会显著增加CPU计算开销。哪怕是普通的idle会话(事务已结束但连接未断开),虽然不会加入活跃XID集合,但遍历ProcArray时仍要处理这些会话,数量多了也会累积出可观的开销。共享内存的锁竞争加剧
ProcArray是多会话共享的结构,当大量会话同时创建快照时,会对这个结构产生更多的锁竞争,导致会话等待锁的时间增加,间接拖慢快照创建的速度。
注意:普通的idle会话(事务已提交/回滚,仅连接保留)影响相对有限,但
idle in transaction的空闲会话是拖慢快照创建的主要元凶,因为它们的事务始终处于活跃状态,会持续占用ProcArray中的活跃事务槽位。
内容的提问来源于stack exchange,提问作者Fabrice Chapuis
相关产品推荐
相关产品推荐

