千家信息网

PostgreSQL在启动时怎么分配共享缓存

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"PostgreSQL在启动时怎么分配共享缓存",在日常操作中,相信很多人在PostgreSQL在启动时怎么分配共享缓存问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2026年11月03日PostgreSQL在启动时怎么分配共享缓存

这篇文章主要介绍"PostgreSQL在启动时怎么分配共享缓存",在日常操作中,相信很多人在PostgreSQL在启动时怎么分配共享缓存问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PostgreSQL在启动时怎么分配共享缓存"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

相信很多人知道 shared_buffers 这个参数,它设置共享缓存的大小,本篇简单讲一下它是怎样分配的。

1、参数设置(src/backend/utils/misc/guc.c)

     /*         * We sometimes multiply the number of shared buffers by two without         * checking for overflow, so we mustn't allow more than INT_MAX / 2.         */        {                {"shared_buffers", PGC_POSTMASTER, RESOURCES_MEM,                        gettext_noop("Sets the number of shared memory buffers used by the server."),                        NULL,                        GUC_UNIT_BLOCKS                },                &NBuffers,                1024, 16, INT_MAX / 2,                NULL, NULL, NULL        },

可以看到,这个参数在内核中并不是实际内存的大小,而是块数GUC_UNIT_BLOCKS(这个有兴趣可以读guc代码,看起来也有必要单独写一篇。)

假设我们设置512M,编译时选择块尺寸8k,那么应该分配块数是 51210241024/8192,总共65536个块。

2、共享内存的分配

实际上,共享缓存只是共享内存的一部分,这不是我们本篇的重点,所以只是简单一提。数据库启动时计算总共享内存的大小,然后从OS申请(src/backend/storage/buffer/buf_init.c):

SizeBufferShmemSize(void){        Size            size = 0;        /* size of buffer descriptors */        size = add_size(size, mul_size(NBuffers, sizeof(BufferDescPadded)));        /* to allow aligning buffer descriptors */        size = add_size(size, PG_CACHE_LINE_SIZE);        /* size of data pages */        size = add_size(size, mul_size(NBuffers, BLCKSZ));...        size = add_size(size, mul_size(NBuffers, sizeof(LWLockMinimallyPadded)));        /* to allow aligning the above */        size = add_size(size, PG_CACHE_LINE_SIZE);        /* size of checkpoint sort array in bufmgr.c */        size = add_size(size, mul_size(NBuffers, sizeof(CkptSortItem)));...

还有块描述符、锁、检查点排序区的分配,这里有过大的改动,为了更好的利用cache line,早先版本一个单独的结构体拆成多个。

诸位有兴趣可以找以前的代码做对比,不写这篇文章我都不会看到这变化,对社区补丁关注不够。

3、共享缓存初始化

在申请OS共享内存(见PGSharedMemoryCreate,有多个平台版本)之后,再从中分配(ShmemInitStruct)出上边看到的几个部分,这些代码见src/backend/storage/buffer/buf_init.c:

    BufferBlocks = (char *)                ShmemInitStruct("Buffer Blocks",                                                NBuffers * (Size) BLCKSZ, &foundBufs);

这是缓存部分的申请,可以看到,它又从共享内存中分配出512M(65536*8192)。

然后就是初始化,各种锁、状态。

4、更多考虑

从上边代码可以看出为什么PG不能动态增加共享缓存,因为它的块描述是一次性分配,然后就不能再改变。考虑下Oracle参数SGA_MAX_SIZE,允许动态分配但有这个上限,可以推断它似乎也有缓存块描述符类似的东西,一次性分配留作以后使用。PG想实现动态管理是不是就有了思路,也不是很难,这取决于共享内存的分配方式,可以阅读 PGSharedMemoryCreate 了解更多,也可以对比以前的老版本,看看分配方式实现有什么不同(记得是 9.1、9.2)。

到此,关于"PostgreSQL在启动时怎么分配共享缓存"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

分配 缓存 内存 代码 参数 更多 学习 动态 大小 版本 一次性 上边 兴趣 只是 多个 实际 方式 篇文章 帮助 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 天津市摩尔互联网科技 广州淘业互联网络科技 哈尔滨大商圈互联网科技有限公司 互联网科技公司经营范围 科技创新与互联网经济 没上市的科技互联网公司 银优互联网科技有限公司 互联网科技公司有哪些 四川狮子座互联网科技 互联网实体化科技化 科技与互联网的利与弊 互联网科技教育视频 互联网大会黑科技排名 互联网科技人工智能实验室 上海科技产业互联网平台 四川互联网展示科技馆设计 富国互联网金融科技混合基金 半导体行业属于互联网高科技类吗 扫呗互联网科技有限公司 互联网络科技 广州大一互联网络科技有限公司 互联网 科技公司 北京互联网科技有限公司 深圳卡尔迅互联网科技有限公司怎么样 互联网金融中的现代科技 锡山区互联网智能科技产品供应 普陀区互联网教育科技管理办法 互联网科技博主张洲 如何强化互联网金融科技
0