对于重度依赖于内存的应用数据库而言,hugepage是经常会被使用的。例如在Oracle中我们一般建议当SGA大于8GB时使用hugepage,而在postgresql中我们也建议当内存较大的时候开启hugepage。

为什么呢?这是因为Linux需要维护虚拟内存地址与物理内存的映射关系,为了提升转换性能,最好这部分能够cache在cpu的cache里面。页越大,映射表就越小。使用huge page可以减少页表大小。

接下来我们来看看pg中hugepage的设置方法。

设置方法:

1、首先我们需要看看数据库使用了多少内存。
获得PID
$ head -1 $PGDATA/postmaster.pid
4170

计算数据库启动用了多少内存,指定进程ID
$ pmap 4170 | awk ‘/rw-s/ && /zero/ {print $2}’
6490428K

2、计算需要使用多少hugepage
查看hugepage页大小
grep ^Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB

计算需要多少hugepage(或者直接使用shared_buffer/hugepage页大小)
6490428 / 2048 = 3169.15

一般建议设置大于内存数,因为这里我们取整为:3170

3、分配hugepage
vi /etc/sysctl.conf
vm.nr_hugepages = 3170
sysctl -p

4、设置数据库参数
huge_pages = on # 或者try
shared_buffers = 64GB # 使用64G内存

5、重启数据库并查看hugepage使用情况
cat /proc/meminfo |grep -i huge

AnonHugePages: 6144 kB
HugePages_Total: 3170 ## 设置的HUGE PAGE
HugePages_Free: 3170 ## 这个是当前剩余的,但是实际上真正可用的并没有这么多,因为被PG锁定了3170个大页
HugePages_Rsvd: 3170 ## 启动PG时申请的HUGE PAGE
HugePages_Surp: 0
Hugepagesize: 2048 kB ## 当前大页2M

注意事项:

1、当配置参数huge_pages设置为on时,若PG启动时需要注册的共享内存大于操作系统提供的Huge Page大小时,数据库将无法启动。推荐将huge_pages参数设置为try,在此种场景下,PostMaster将会改为申请普通内存。
2、如果连接数较少时,使用HUGE PAGE性能不如不使用。因此我们可以尽量使用连接池,减少连接数,提升性能。