开启huge_pages的PostgreSQL数据库SHMMAX/SHMALL内核参数配置问题
关于PostgreSQL配套内核参数的配置解答
一、kernel.shmall的页大小基准
首先明确:kernel.shmall的计数单位是系统默认的常规内存页大小,也就是你通过getconf PAGE_SIZE得到的4096字节,和大页(HugePage)的2MB页大小没有关系,你之前按2MB为基准的配置逻辑是错误的。
二、当前shmall配置的问题
你当前设置kernel.shmall = 4096的话,实际允许的总共享内存大小为:4096 * 4KB = 16MB
远低于你的PostgreSQL 4GB shared_buffers的需求,会导致PostgreSQL启动时共享内存分配失败,必须调整。
三、各参数最优配置建议
kernel.shmall:建议设置为总内存大小除以常规页大小,16GB内存的场景下计算为16 * 1024 * 1024 KB / 4KB = 4194304,可以直接设为4194304,足够覆盖所有场景的共享内存需求。如果想收紧上限也可以按你设定的kernel.shmmax对应值设置,你的kernel.shmmax = 8GB对应需要至少2097152,留余量的话设300万以上即可。kernel.shmmax:你当前设置的8GB是合理的。该参数为单个共享内存段的最大允许值,只要大于PostgreSQL的shared_buffers大小即可,16GB内存场景下设为总内存的50%~75%都属于合理范围。vm.nr_hugepages:你当前设置的2300是合理的。计算逻辑为shared_buffers大小除以大页大小再加10%左右的余量:4GB / 2MB = 2048,加余量到2300足够使用,从你当前的/proc/meminfo查询结果也能看到大页预留和使用状态正常。- PostgreSQL侧
huge_page = 'on'配置正确,使用大页可以有效降低TLB缓存命中率损耗,提升数据库内存访问性能。
内容的提问来源于stack exchange,提问作者supersantos
相关产品推荐
相关产品推荐

