我相信各位做linux系统性能优化的朋友对于 HugePage并不陌生了,今天我们来为各位分享一篇HugePage用法例子.
在Linux环境性能优化实践中,HugePage是一个经常提到的方法,简单的说,HugePage就是Linux内核上一种是用内存块的方法,作为传统4K Page的替代,HugePage在大部分场景下可以提升Oracle实例的运行性能效率.
一、HugePage介绍
HugePage广泛启用开始于Kernal 2.6,一些版本下2.4内核也可以是用,在操作系统Linux环境中,内存是以页Page的方式进行分配,默认大小为4K,如果需要比较大的内存空间,则需要进行频繁的页分配和管理寻址动作.
HugePage是传统4K Page的替代方案,顾名思义,是用HugePage可以让我们有更大的内存分页大小,无论是HugePage还是传统的正常Page,这个过程都涉及到OS内存寻址过程.
当一个进程访问内存的时候,并不是直接进行内存位置访问,是需要通过Page Table进行转移变换,在使用HugePage的情况下,PageTable具有了额外的属性,就是判断该页记录是HugePage还是Regular Page.
在Oracle运行环境中开启HugePage是有很多好处的,具体如下.
非Swap内存:当开启HugePage的时候,HugePage是不会Swap的.
减少TLB(Translation Look aside Buffer)负担:TBL是在CPU里面的一块缓冲区域,其中包括了部分Page Table内容,使用HugePage可以减少TLB工作负载.
减少Page Table空间负载:在PageTable管理中,每条Page记录是要占据64byte的空间的。也就是说,如果一块50G的RAM,4k大小的PageTable要有80MB左右;
减少PageTable检索负载:更小的PageTable意味着更快的检索定位能力;
内存性能提升:Page数量减少、大小的增加,减少了管理过程的复杂性,进一步减少了瓶颈出现的概率;
对于Oracle而言,实例运行环境(Database和ASM)都面对一个HugePage优化的问题。
二、基础环境准备
我们选择Kernel2.6下的centos版本进行实验。
[oracle@361way ~]$ uname -r
2.6.18-128.el5
此时Oracle实例为11gR2(11.2.0.3),运行在AMM内存管理方式下,共享内存段信息如下.
- [oracle@361way~]$ipcs-m
- ------SharedMemorySegments--------
- keyshmidownerpermsbytesnattchstatus
- 0x0000000032768oracle64040960
- 0x0000000065537oracle64040960
- 0x01606d3098306oracle64040960
- [oracle@361way~]$grepHuge/proc/meminfo
- HugePages_Total:0
- HugePages_Free:0
- HugePages_Rsvd:0
- Hugepagesize:4096kB
注意两个问题:一个是当前我们在meminfo中没有启用HugePage,所以没有对应的记录,另一个是AMM下,ipcs –m显示出的共享内存大小只有三个每个大小4096bytes.
这个问题是比较复杂的,本篇就介绍一个开头,在10g中,Oracle引入了sga_target系列参数,实现了ASMM(Automatic Shared Memory Management),ASMM的本质是实现SGA和PGA内部各个池之间的动态调整,但是在11g中,推出了AMM(Automatic Memory Management),实现了PGA和SGA之间的调节.
AMM其实是复杂的,SGA在Linux中是通过系统共享内存实现,而PGA是通过进程私有空间实现,AMM实际上最大的功能是将SGA和PGA空间调节的通道打通,这必然带来对原有SGA共享内存方式架构的影响,在AMM时,ipcs –m显示的虚拟空共享段就是实际效果的一部分.
三、用户内存配置
启用HugePage的第一步就是进行用户参数限制打通,当前内存大小如下:
--内存信息
- [root@361way~]#free-t
- totalusedfreesharedbufferscached
- Mem:918380205044713336014744152996
- -/+buffers/cache:37304881076
- Swap:245578802455788
- Total:33741682050443169124
修改/etc/security/limits.conf参数文件,添加数据库实例用户的memlock限制.
- [root@361way~]#cat/etc/security/limits.conf
- #/etc/security/limits.conf
- #
- (篇幅原因,有省略……)
- #-fsize-maximumfilesize(KB)
- #-memlock-maxlocked-in-memoryaddressspace(KB)
- #-nofile-maxnumberofopenfiles
- #ftphardnproc0
- #@student-maxlogins4
- oraclesoftnproc2047
- oraclehardnproc16384
- oraclesoftnofile1024
- oraclehardnofile65536
- oraclesoftmemlock918380
- oraclehardmemlock918380
- #Endoffile//phpfensi.com
这个过程中使用memlock标记,用于设置每个用户允许的最大内存使用情况,这个取值可以设置为数据库服务器物理内存大小,切换到指定用户(oracle),查看设置.
- [oracle@361way~]$ulimit-l
- 918380
四、Oracle设置
如果是使用11g Oracle版本,一定需要进行额外的配置,就是将使用的AMM退化为ASMM,在早期的11.2.0.1版本中,这个步骤很重要,因为AMM是不支持HugePage的,如果强在AMM+HugePage模式下打开数据库,是会遇到失败信息.
在最新的11.2.0.2版本以及之后,引入了参数use_large_pages,避免了这样的问题,但是AMM与HugePage不兼容的情况,还是存在.
当前是使用AMM的数据库.
- SQL>showparametertarget
- NAMETYPEVALUE
- -----------------------------------------------------------------------------
- archive_lag_targetinteger0
- db_flashback_retention_targetinteger1440
- fast_start_io_targetinteger0
- fast_start_mttr_targetinteger0
- memory_max_targetbiginteger360M
- memory_targetbiginteger360M
- parallel_servers_targetinteger16
- pga_aggregate_targetbiginteger0
- sga_targetbiginteger0
AMM的关键在于两个方面,一个是memory_target和memory_max_target设置非空,另一个是sga_target和pga_aggregate_target参数设置为空,如果要关闭AMM,退化开启ASMM,就需要进行实例启动参数的设置.
说明:本篇不是以修改AMM到ASMM作为重点,这部分内容略,留待其他文章进行说明,修改之后,需要重启服务器,因为一些参数属于静态参数.
- SQL>conn/assysdba
- Connected.
- SQL>showparametertarget
- NAMETYPEVALUE
- -----------------------------------------------------------------------------
- archive_lag_targetinteger0
- db_flashback_retention_targetinteger1440
- fast_start_io_targetinteger0
- fast_start_mttr_targetinteger0
- memory_max_targetbiginteger0
- memory_targetbiginteger0
- parallel_servers_targetinteger16
- pga_aggregate_targetbiginteger108M
- sga_targetbiginteger252M
注意,此时共享内存机制才真正实现,我们从ipcs –m中,可以看到真正的共享段.
- [oracle@361waydbs]$ipcs-m
- ------SharedMemorySegments--------
- keyshmidownerpermsbytesnattchstatus
- 0x00000000327680oracle640419430427
- 0x00000000360449oracle64026004684827
- 0x01606d30393218oracle640419430427
五、经验脚本计算HugePage最大值
在MOS 401749.1中,Oracle推荐了一个Shell脚本来计算HugePage值,运行这个脚本,将计算出的取值设置在系统参数中.
- [oracle@361wayupload]$ls-l|grephuge
- -rwxr-xr-x1oracleoinstall3037Oct2209:42hugepages_settings.sh
执行脚本,注意这个过程中要求Oracle所有实例,包括数据库和ASM都启动、AMM关闭,以及SGA大小超过100M.
- [oracle@361wayupload]$./hugepages_settings.sh
- Thisscript.isprovidedbyDocID401749.1fromMyOracleSupport
- (http://support.oracle.com)whereitisintendedtocomputevaluesfor
- therecommendedHugePages/HugeTLBconfigurationforthecurrentshared
- memorysegments.Beforeproceedingwiththeexecutionpleasenotefollowing:
- *ForASMinstance,itneedstoconfigureASMMinsteadofAMM.
- *The'pga_aggregate_target'isoutsidetheSGAand
- youshouldaccommodatethiswhilecalculatingSGAsize.
- *IncaseyouchangestheDBSGAsize,
- asthenewSGAwillnotfitinthepreviousHugePagesconfiguration,
- ithadbetterdisablethewholeHugePages,
- starttheDBwithnewSGAsizeandrunthescript.again.
- Andmakesurethat:
- *OracleDatabaseinstance(s)areupandrunning
- *OracleDatabase11gAutomaticMemoryManagement(AMM)isnotsetup
- (SeeDocID749851.1)
- *Thesharedmemorysegmentscanbelistedbycommand:
- #ipcs-m//phpfensi.com
- PressEntertoproceed...
- Recommendedsetting:vm.nr_hugepages=67
将计算出的67更改参数/etc/sysctl.conf
--设置参数
[root@361way ~]# vi /etc/sysctl.conf
(添加内容如下……)
vm.nr_hugepages = 67
"/etc/sysctl.conf" 49L, 1325C written
使用sysctl –p生效设置。
[root@361way ~]# sysctl -p
net.ipv4.ip_forward = 0
(篇幅原因,有省略……)
net.core.wmem_max = 1048586
vm.nr_hugepages = 67
六、HugePage启动检验
设置之后,最好重新启动服务器,包括Oracle.
- [oracle@361way~]$ipcs-m
- ------SharedMemorySegments--------
- keyshmidownerpermsbytesnattchstatus
- 0x0000000032768oracle640419430426
- 0x0000000065537oracle64026004684826
- 0x01606d3098306oracle640419430426
- [oracle@361way~]$grepHuge/proc/meminfo
- HugePages_Total:67
- HugePages_Free:3
- HugePages_Rsvd:0
- Hugepagesize:4096kB
在meminfo文件中,可以查到HugePages的信息,说明启用成功.
七、概括
普通物理内存的块大小是4KB,当物理内存扩展到了8GB以后,所需要管理的内存块的数量大大增加,然而使用内存都需要花费CPU资源,也就是说程序所用到的内存块数量越多,系统的管理效率就越低,使用的内存总量过大的情况下还可能会导致分配失败的情况,而且在内存分配的时候就越会导致CPU资源占用率高.
在Linux系统上对于大内存(Very Large Memory)的情况,提供了Hugepages的技术,就是使用比较大的内存页面来进行管理,这样的话,对于现今的高端机型,16GB、32GB的内存来说也能够比较轻易应付,在Redhat Linux系统上,一个内存页面的尺寸是2MB.