大页内存
操作系统页表所需空间会随着运行环境总内存的增加而增加。在数百GB级别的内存环境中,使用4K的内存页将导致数据库进程页表空间变大,同时TLB miss的概率增加,这将拖慢数据库的查询速度,并且浪费主存空间。为避免大内存运行环境下系统内存页过小导致性能下降,Vastbase引入大页内存功能。当配置文件的enable_huge_pages设置为on时Vastbase数据库在启动时将从操作系统预分配的大页内存中创建共享内存。
用户可以根据运行环境决定是否开启大页内存。根据实践,数百GB级别内存的环境下,若系统内存页大小为4K,开启大页内存可以提高数据库性能。一般而言,数百GB级别的环境下,可以考虑使用大小为2MB的大页;若环境内存达到TB级别,可以选择更大的大页。
enable_huge_pages
参数说明:设置数据库共享内存是否使用大页内存分配。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。在主备场景中,该参数不会被同步到其他节点。
取值范围:布尔型
- on:表示使用大页内存进行共享内存分配。
- off:表示使用普通内存页进行共享内存分配。
默认值:off
启用大页内存需要提前在操作系统完成大页配置。具体配置方法详见下方示例。
huge_page_size
参数说明:大页内存使用的页面大小。该选项仅在enable_huge_pages设置为on时生效。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。在主备场景中,该参数不会被同步到其他节点。
取值范围:整型,0 ~ 1073741823,单位为8KB。也可按照xxkB、xxMB、xxGB的方式设置。
默认值: 0,代表使用操作系统默认的大页大小。操作系统默认值可以通过/proc/meminfo中的Hugepagesize项查看。
此参数的值必须是当前环境操作系统下可选的大页大小。具体的大页可选值可以通过/sys/kernel/mm/hugepages/目录查看。若enable_huge_pages设置为on时,填入的大页大小在当前环境下不支持,数据库将无法启动。
不同操作系统提供不同大小的大页,具体选择需参考运行环境总内存大小,以及当前环境下内存负载情况。一般而言,对于数百GB级别的内存环境,可以选择2MB的大页。对于TB级别的内存环境,则可选择更大的大页。
示例
1、查看系统默认大页大小。
cat /proc/meminfo | grep Hugepagesize
2、查看系统支持大页大小。
ls /sys/kernel/mm/hugepages
3、设置大页数量。
设置大页数量前,用户需要知道当前配置下数据库的共享内存共需多少个页面。以使用2MB大页为例。当配置文件中enable_huge_pages设置为on时,数据库启动将打印如下日志:
LOG: Allocate shared memory as huge pages. Huge page size: 2048 KB, required pages count: 1670
此日志提示用户在当前配置下,数据库的共享内存将需要1670个2MB大页。此时,更改/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages文件的值。
设置大页时操作系统需寻找指定数量的空载内存。以本示例为例,操作系统将寻找1670个大小为2M的空载内存进行大页内存的分配。若无法找到指定数量的空载内存,操作系统将设置当前可分配的最大数量。因此,设置大页内存后请检查文件,确保大页数量充足以保证数据库正常启动。
echo 1670 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
启动数据库后,可以通过/proc/meminfo查看系统当前大页的使用情况。
4、给与数据库进程用户使用大页内存权限。
查看数据库进程用户所属用户组id,给与用户使用大页内存权限。
id Vastbase
sysctl -w vm.hugetlb_shm_group=xxxx
5、设置配置文件postgresql.conf,将enable_huge_pages设置为on,开启大页功能。
6、重启数据库。