1、增量检查点的增量检查点的“困困”与与“难难”吕海波易景科技首席研究员PG ACED 北京大学企业导师 开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志TAC TAC 共享存储集群与增共享存储集群与增量检查量检查点ckptqckptq 共享内存锁管理共享内存锁管理机制机制增量检查增量检查点与与 FPWFPW目录CONTENTS开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志TAC(True Application Cluster)TAC(True Application Cluster
2、)共享存储集群共享存储集群开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志联接层HSM 存储层计算层计算层应用层增量检查增量检查点开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志 核心思想核心思想:增加 ckptq(检查点队列),按块变脏顺序,排列所有脏块沿 ckptq 写脏块 分享两个关键点分享两个关键点:ckptq 共享内存锁管理机制Full Page Write的处理ckptqckptq 共享内存锁管理机制共享内存锁管理机制开源生态大会暨开源生态大会暨PostgreSQLPos
3、tgreSQL高峰论坛高峰论坛以开源之道见致远之志 自璇锁从Lock-Free编程,到Latch/Mutex,自璇锁无处不在。PG中的自璇锁:s_lock()SpinLockInit()SpinLockAcquire()SpinLockRelease()SpinLockFree()自璇的目的不自璇,无法得到锁,就要被设为Sleep状态,让出CPU。自璇可以霸占CPU,避免换出CPU后,Cache被其他进程污染。0Sess 1Sess 21Sess 1 加锁成功Sess 2 检查锁值,非零,锁已被其他进程持有Sess 2 循环重复检查锁值,直到锁值为0(或循环一定次数),称为自璇。ckptqck
4、ptq 共享内存锁管理机制共享内存锁管理机制开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志 自璇锁竞争时的问题当某一锁遭遇竞争,多个进程同时自璇时,会导致一个严重问题。下面将视角切换到CPU。0Sess 1Sess 21Sess 2 循环重复检查锁值,直到锁值为0(或循环一定次数),称为自璇。Sess 3Sess 4Sess nckptqckptq 共享内存锁管理机制共享内存锁管理机制开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志 从CPU角度观察Core 0 持有Lock当Co
5、re 0 释放锁时,修改锁变量为0Core 0Core 1Core 2Core 3Core 4Core 5Core 6Core 7Core 8Core 9Core 10Core 11Core 12Core 13Core 14Core 151ckptqckptq 共享内存锁管理机制共享内存锁管理机制开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志 从CPU角度观察Core 0 持有Lock当Core 0 释放锁时,修改锁变量为0但是另外15个Core不断在读此变量的值,Core 0要广播一个Invalite 消息给另外15个Core。之后,
6、才能修改锁变量为0Core 0Core 1Core 2Core 3Core 4Core 5Core 6Core 7Core 8Core 9Core 10Core 11Core 12Core 13Core 14Core 151 0ckptqckptq 共享内存锁管理机制共享内存锁管理机制开源生态大会暨开源生态大会暨PostgreSQLPostgreSQL高峰论坛高峰论坛以开源之道见致远之志 从CPU角度观察Core 0 持有Lock当Core 0 释放锁时,修改锁变量为0但是另外15个Core不断在读此变量的值,Core 0要广播一个Invalite 消息给另外15个Core。之后,才能修改锁变