操作系统HugePage配置导致内存骤降探究

来源:这里教程网 时间:2026-03-03 19:34:52 作者:

一、故障描述

某次,用户某套数据库最初的大页参数设置值为 vm.nr_hugepages = 138246,运行 Oracle官方脚本 hugepages_settings.sh之后,将对应的参数值进行了微调 vm.nr_hugepages = 204810,大页新值生效后,骤然,系统可用物理内存出现急速下降。

二、根因分析

通过具体分析, vm.nr_hugepages 值设置为 138246时,系统内存使用情况:

vm.nr_hugepages 值设置为 204810时,系统内存使用情况:

通过上图可以看出,参数调整前后,系统内存 free值从 200G左右降低至 80G,系统内存迅速减少,且对比发现系统的 buff/cache缓存无明显变化。为此引出了对应的问题,调大 hugepages大页内存后,数据库的可用内存为何会迅速降低。

分析 Alert日志可以看出, vm.nr_hugepages设置为 138246,由于该数据库的 SGA配置为 400Ghugepages大页的内存页不足,进行 sga分配时,内存会通过大页内存( 2048k)和普通页( 4k)内存构成,日志信息如下:

上述的启动日志可以看出,当前实例 SGA设置的内存为 400G,可用的内存分为两个部分,分别为 4k页内存和 2048k页的内存。其中 4k也的内存页分配了 34078751个,约为 130G2048k的内存页分配了 138241个,约为 270G。数据库进行 hugepage分配时,会预留至少 5个大页内存,所以实际分配的大页个数与设置的个数存在一定差异。通过操作系统层,也可以直接看出大页的使用情况。

后续将 vm.nr_hugepages调整为 204810,即大页的内存大小设置为 400G,然而由于数据库 SGA采用的是预分配的方式,数据库 SGA内存段已经安装 130G4k页和 270G2048k页内存进行了分配,虽然调大了 2048k的内存页分配,但数据库并不能对 SGA的内存进行重新分配,导致增加的大页内存并未被数据库使用。通过系统可以看出,调整大页内存后的使用情况,如下图:

通过计算( Total-Free=204810-66569=138241)的值,可以看出,虽然调大了大页分配的值,但是实际上新增的大页内存并未被使用,当前被使用的 2048k页的个数依然为 138241个。有 66569hugepage的内存页( 66569*2048=130G)没有被使用,从而造成了系统内存的浪费。

三、解决方案

通过上述的分析可以看出,由于数据库的 SGA内存已经进行了预分配,直接调整 vm.nr_hugepages值,会造成大量的 HugePages_Free产生,而这些大页内存只能被共享内存使用,如此会造成大量的内存浪费,导致系统剩余内存迅速降低。

建议调整 vm.nr_hugepages值后,将数据库进行重启,如此才能启动的时候 SGA全部使用大页内存,将之前预分配的 4k页内存进行释放,从而保障了数据库运行性能的同时,节省了系统内存的资源,实现数据库系统的稳定运行。同时,也要注意 memory lock资源限制选项配置对大页的影响。

相关推荐