POSTGRESQL 设置hugepage 可以让系统使用内存更有效率,防止OOM

https://www.percona.com/blog/why-linux-hugepages-are-super-important-for-database-servers-a-case-with-postgresql/

https://bbs.huaweicloud.com/blogs/detail/156799

Hugepage 是什么,基于LINUX 系统,大页面对虚拟内存管理是有必要的。除标准的4KB页面之外,还进行内存中的大页面的管理,可以使用大页面定义1GB的页面大小的内存页面。在虚拟内存管理中,内核维护一个表,其中有一个虚拟内存地址到物理地址的映射。对于每个页面事务,内核都需要加载相关的映射。如果页面较小,则需要加载更多的页面,从而导致内核加载更多的映射表。

在系统运行后,可以通过下面的脚本来调整你hugepage  的设置,脚本来自oracle 公司。

#!/bin/bash

#

# hugepages_settings.sh

#

# Linux bash script to compute values for the

# recommended HugePages/HugeTLB configuration

#

# Note: This script does calculation for all shared memory

# segments available when the script is run, no matter it

# is an Oracle RDBMS shared memory segment or not.

# Check for the kernel version

KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`

# Find out the HugePage size

HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`

# Start from 1 pages to be on the safe side and guarantee 1 free HugePage

NUM_PG=1

# Cumulative number of pages required to handle the running shared memory segments

for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`

do

   MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`

   if [ $MIN_PG -gt 0 ]; then

      NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`

   fi

done

# Finish with results

case $KERN in

   '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;

          echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;

   '2.6' | '3.8' | '3.10' | '4.1' ) echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;

    *) echo "Unrecognized kernel version $KERN. Exiting." ;;

esac

# End

(需要系统运行,并在正常使用中运行脚步,获得调整值)

然后将给出的建议,放入到  /etc/sysctl.conf  系统文件,然后执行

sudo sysctl -p 将参数加入到系统中。

fd81d72c5e8b27a5f19a4aa2a7977f73.png

下面我们就操作通过PG 的数据库压测对比一下,在没有hugepage 和 启用huge page 系统在使用中内存消耗的不同。

791daa43d155d6742267f96ac5bd2a5c.png

8f074132fbfba36f8c71273d7fecc21a.png

在压力测试中,可以关注used 和  available 的内存变化,这里可以看到在压测的时候, 两个参数一直在下降,这样很容易引起 OOM 

173956beea45b26edb0d87c5229a7de6.png

959d3efd56d7ef39823594146c5f3df7.png

打开hugepage 并进行一些配置,后再次进行测试 (后面在说怎么进行配置,怎么进行的压测)

686b9e734bc1aa13aebb77a6b614cc7f.png

通过上面和下面这两个图对比,used 在同样的压力下,基本上没有变化,used 变化较大。这证明在压力测试的时候,PG 在使用内存方面比较稳定。

5011cbcd68ac0926a976a9bf0c179c05.png

下面来说说怎么设置的

1  如何进行huge page 的设置

首先在系统运行时,通过命令获得postgres 中postmaster 的PID ,在通过命令 grep ^VmPeak /proc/5599/status, 获得使用的vmPeak的数量

2 通过计算数据转换为MB /2 ,然后将计算好的数据填入系统文件中 (页面预设尺寸 2mb)

3  vi /etc/sysctl.conf  输入计算好的数据  vm.nr_hugepages = 2245

96be075d6d691235c2e6eac7b7d37315.png

1fa79cb6a6788f0788288b08e3145d61.png

4   运行 sysctl -p  命令

1e8a4ed6d0165e28bc6c97a5f7662c8e.png

5  修改PG 的配置文件强制 huge_page = on 

6  重启动PG 服务

经过上面的测试可以证明在打开huge_page = on (默认是try) 的情况下对内存占用有一定的保护,降低OOM 的风险。

注:try 的情况下 ,有可能无法打开huge_page = on  启动时也有可能失败,具体原因找时间在说。

ebe742de0b7aa00a600867877b859495.png

压力测试以及硬件配置为 16G 内存,2CORE CPU  SSD 磁盘, 模拟80客户端进行压力测试。

7cba2f16cdb3880b084b75b39f9dd8dd.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值