前言
大页的作用是为了提升内存管理的效率,减少内存管理资源消耗(节省pagetable的开销),特别是对于大内存的情况,同时,由于hugepage相对与4k的页面,它更不容易被交换出内存,因此,它的作用是把shared_buffers内存区域锁定在物理内存,这样就不会使用到swap。Pagetable是为了维护虚拟内存地址和物理内存地址的映射关系。所以,如果对于大内存的shared_buffers,使用大页可以提高性能,同时降低pagetable的大小,因为linux默认是一个个4kb的固定内存进行管理,hugepage默认是2mb的内存管理方式,因为开启大页后会降低pagetable的开销和大小。我们知道在oracle中,如果sga很大也要开启标准大页。它至少要大于共享内存。
操作系统存在两种大页:标准大页与透明大页。两种大页根本的区别:Huge Page 是预分配的,Transparent Huge Pages 是动态分配的。在两者一起使用的情况下,可能会导致性能问题和系统重启,建议禁用Transparent Huge Pages。
配置标准HUGEPAGE
计算hugepage:
获得pid
[kingbase@localhost data]$ head -1 /home/kingbase/cluster/my_project/repmgr_test/kingbase/data/kingbase.pid
3000
计算数据库启动消耗多少内存,指定进程ID:
[kingbase@localhost data]$ pmap 3000 | awk '/rw-s/ && /zero/ {print $2}'
400800K
hugepage大小是2048kb
[kingbase@localhost data]$ grep ^Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB
计算需要多少hugepage:
400800/2048=196 因此至少需要196个大页
分配大页:
执行命令:sysctl -w vm.nr_hugepages=196
添加进系统配置文件以便重启生效:
echo 196 > /proc/sys/vm/nr_hugepages
vi /etc/sysctl.conf
vm.nr_hugepages = 196
让参数生效
sysctl -p
运行sysctl -p 后,可以看到实际大页内存已经分配
查看大页使用情况:
[kingbase@localhost data]$ cat /proc/meminfo | grep huge -i
AnonHugePages: 20480 kB
HugePages_Total: 196
HugePages_Free: 196
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
AnonHugePages: 表示透明大页,建议关掉。
HugePages_Free:还剩余多少个大页,尚未分配的HugePages数量,真正空闲的页数等于HugePages_Free-HugePages_Rsvd。
Hugepagesize:每个大页的大小为2MB。
关闭透明大页
/etc/rc.local中加入下面内存,然后重启服务器:
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
或者修改/etc/grub.conf
添加
transparent_hugepage=never
numa=off
注:两种大页的区别:HugePage 是预分配的,Transparent HugePages 是动态分配的。
配置数据库参数
大页面的默认行为是尽可能使用它们并且在失败时回到正常页面。要强制使用大页面,可以在kingbase.conf中把huge_pages设置成on。注意此设置下如果没有足够的大页面可用,数据库将会启动失败。一般建议默认值try即可。
下面需要配置kingbase.conf:
huge_pages = try
然后重新启动数据库服务生效
重启数据库后查看大页是否启动:
sys_ctl restart
获得PID
head -1 /home/kingbase/cluster/my_project/repmgr_test/kingbase/data/kingbase.pid
16283
计算数据库启动用了多少内存,指定进程ID
pmap 16283 | awk '/rw-s/ && /zero/ {print $2}'
没有返回结果,说明使用了huge page。