页表共享:一种动态内存扩缩设计
August 25th, 2026
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)操作。