页表共享:一种动态内存扩缩设计

August 25th, 2026 Administrator No comments

背景

PolarDB:PolarDB数据库共享内存三种形式 & 内存扩缩

当前数据库有三种共享内存形式,是同时存在的:

  • mmap方式申请的anonymous shared memory;地址通过fork传递;
  • sysv方式申请的buffer pool;这部分分为两个功能,一个叫做persisted buffer pool,这部分是为了我们能在异常重启后继续使用内存,地址通过fork传递;一个叫做dsga,就是我们的共享内存的扩缩,地址通过attach detach内存段实现地址共享(维护了一个1TB的虚拟内存地址,通过fork传递);
  • 并行查询的动态共享内存,根据参数可以使用mmap/sysv/posix三种方式,地址通过attach detach内存段实现地址共享。每个进程有自己的内存段地址;

站在OS的角度,这里有两类shared memory需要使用页表共享。

​

在线扩缩共享内存:

现有的扩缩方式,需要在父进程调整后,attach和detach子进程,在子进程数量大的时候这种通信开销较大。如果使用页表共享,仅仅需要父进程调用madvise(MADV_DONTNEED)即可。如此即可将使用的内存释放出来。扩缩的需求是能够对最小到2M粒度的内存(边界都是2M对齐)进行madvise(MADV_DONTNEED)操作。


...