基于 openGauss 源码(~/opengauss/source)整理的 GaussDB 内核技术分析笔记,
重点覆盖等待事件源码解析、WAL 并行写架构对比、Dorado 双集群 sync 同步机制,
以及可观测性方法论。
Dorado 双集群共享盘 sync 架构下 wait wal sync / wait transaction sync /
SharedStorageWalWrite 三个等待事件的源码级分析。
覆盖:
- commit 时间轴 A~I 各段代码映射(含 file:line)
- F 段(SharedStorageWalWrite)和 I 段(wait wal sync)精确覆盖范围
- wait transaction sync 与 commit 链路的旁路关系
- 开源 openGauss 与企业版 GaussDB 的 SharedStorage* 事件差异
- Dorado 双集群架构下 I 段等待对象的三种可能
- 排查 SQL 与决策树
在 wait-wal-sync 基础分析上的扩展发现(1480 行完整版)。
覆盖:
pg_thread_wait_status里"commit 线程堵 insert 线程"根因(慢 commit + MVCC 唯一键可见性)wait transaction sync是wait wal sync的级联次生症状(因果链 + 代码锚点)wait wal sync代码级精确边界(syncrep.cpp:315→505)+ 5 个子段完整代码- 10ms 自旋快路径是观测盲区
- SS_DORADO_CLUSTER 下
wait wal sync真实语义(等备集群 redo apply,不是等 Dorado 同步) - 关键代码证据
walsender.cpp:2987(apply vs flush 语义差异) - 三种
wait wal sync高的情况及判别矩阵 - 双集群 4 条物理链路(3 条 SAN + 1 条 IP)
- 完整数据流 + 跨机房双光纤的细节
Dorado 双集群模式下数据面(Dorado 光纤同步)和控制面(TCP 复制协议)的分工分析。
覆盖:
- 双通道各自承担的信息类型
- 普通流复制 vs SS_DORADO_CLUSTER 的流量差异
reply.apply消息格式(40 字节控制面元数据)- 长连接建立时机与生命周期(不是"突然"建立)
walsender主循环 +ProcessStandbyReplyMessage源码路径shared_storage_walreceiver特殊实现与普通walreceiver对比- 配置映射(
synchronous_standby_names×application_name)
Oracle / MySQL / PostgreSQL / GaussDB 在 WAL 写入线程模型、fsync 处理、 SCN/LSN 顺序保证等方面的设计差异。
覆盖:
- Oracle 12.2+ Scalable LGWR(LGWR + N worker 并行写)
- Oracle SCN 顺序保证机制(strand + coordinator + durable_watermark + recovery 归并)
- Oracle 为何能并行——根本不用 fsync(ASM 裸设备 / O_DIRECT + O_DSYNC)
- MySQL 8.0 Scalable Redo Log(lock-free buffer + 4 专职线程流水线)
- PostgreSQL / GaussDB 现状(单 walwriter + 8 WAL insert lock)
- GaussDB 学 Oracle 的分层改造路径(O_DSYNC → DSS 裸卷 → 多 walwriter → strand 化 buffer)
5. GaussDB Dorado 双集群同步等待事件全集 ⭐ 推荐先看
把 Dorado 双集群(SS_DORADO_CLUSTER)共享盘 sync 同步架构下, 一次 commit 涉及的全部 8 类等待事件统一梳理成一份完整地图。
覆盖:
- 8 大等待事件逐个详解(A~I 段 + 旁路):WALInsertLock / WALBufMappingLock / walFlushWaitLock / WALWriteLock / WALWrite (SharedStorageWalWrite) / fsync / SharedStorageCtlInfoWriter / wait wal sync / wait transaction sync
- 开源 openGauss vs 企业版 GaussDB 事件对照表
- 事件之间的"配对关系"(F vs I / F vs H / wait wal sync vs wait transaction sync)
- 完整判别矩阵(3 事件组合 + 2 事件组合)
- Dorado 双集群完整 commit 时间轴(带所有事件标注)
- 关键源码锚点完整索引(主链路 + 旁路 + walsender + 宏定义 + 事件名映射)
- 农行场景的特征模式确诊
GaussDB 等待事件采样、慢 SQL 诊断、短暂性能 spike 捕获、日志查看的方法论 与工具,含与 Oracle 同类机制的横向对比。
覆盖:
- LAS(local_active_session)采样误差分析(4 个场景图示)
- Oracle ASH vs GaussDB LAS 全方位对比(7 个维度 + 差距可视化)
- GaussDB 类似 v$sqlstat 的视图:
dbe_perf.statement/statement_history - 短暂性能 spike 捕获(0.3→0.5ms 持续 2 秒的 5 种方案 + 生产架构推荐)
- GaussDB 监听日志查看(
$GAUSSLOG/pg_log/) - GaussDB 时间戳处理函数(
date_trunc/TRUNC等)
分析基于本地 openGauss 源码树:~/opengauss/source
关键源码路径:
src/gausskernel/storage/access/transam/xlog.cppsrc/gausskernel/storage/access/transam/xact.cppsrc/gausskernel/storage/replication/syncrep.cppsrc/gausskernel/storage/replication/walsender.cppsrc/gausskernel/storage/replication/walreceiver.cppsrc/gausskernel/storage/replication/shared_storage_walreceiver.cppsrc/gausskernel/storage/replication/ss_cluster_replication.cppsrc/gausskernel/storage/ipc/procarray.cppsrc/gausskernel/storage/access/transam/clog.cppsrc/gausskernel/storage/access/transam/csnlog.cppsrc/include/replication/ss_disaster_cluster.h
文档分析起点是中国农业银行同城双集群 Dorado sync 同步架构下的性能瓶颈:
- 共享盘每次 IO 延迟 ~1ms
- 主库 WAL 写线程单线程,无法并发
- 单线程 IOPS 上限约 1000
- 小事务支付场景下 TPS 受限
- 伴随大量
wait wal sync/wait transaction sync等待事件
- 新手先看 SS_DORADO 双通道架构 建立整体架构认知
- 再看 wait wal sync 源码分析 理解 commit 时间轴
- 然后看 等待事件扩展分析 掌握诊断模式(重点)
- 接着看 可观测性方法论 学采样/诊断技巧
- 最后看 WAL Writer 跨数据库对比 了解优化空间