PostgreSQL 数据库性能 HugePages

1 背景知识

当postgresql 所在的服务器内存大于32GB时,建议开启大页内存。

cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages:     10240 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB

从结果中看到,尽管大页面的大小设置为2048kB,但大页面的总数为0,这表示当前设置为禁用了大页面。

2 启用大页内存

2.1 设置大页内存的数量

sudo sysctl -w vm.nr_hugepages=76
//屏幕输出:
vm.nr_hugepages = 76
Note

这里设置的大页内存数量为76,表示 76*2M=152MB 的内存用于大页内存。

2.2 查看大页内存的数量

cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages:     10240 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:      76
HugePages_Free:       76
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:          155648 kB

当 (HugePages_Free = HugePages_Total)时,没有程序在使用大页内存。

3 配置数据库使用大页内存

3.1 配置大页内存参数

vi $PGDATA/postgresql.conf 

--------------------input------------------------------
huge_pages=on;

3.2 重启数据库

pg_ctl restart 

3.3 查看大页内存的数量

cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages:     10240 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:      76
HugePages_Free:       68
HugePages_Rsvd:       64
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:          155648 kB

postgresql 启动时使用了少量的大页内存。

3.4 插入大量数据

CREATE TABLE test02(id int);
CREATE TABLE
INSERT INTO test02 values(generate_series(1,10000000));
INSERT 0 10000000

3.5 查看大页内存的数量

cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages:     10240 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:      76
HugePages_Free:        5
HugePages_Rsvd:        1
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:          155648 kB

插入大量数据之后,大部分大页内存都在使用中。

4 小结

注意:此处使用的大页面的样本值非常低,不适用于大型生产环境。请评估系统所需的页数,并根据系统工作负载和资源进行相应设置。