Linux系统HugePage内存功能配置详解

SEO探索者团队 SEO服务&网站优化

我相信各位做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内存管理方式下,共享内存段信息如下.

  1. [oracle@361way~]$ipcs-m
  2. ------SharedMemorySegments--------
  3. keyshmidownerpermsbytesnattchstatus
  4. 0x0000000032768oracle64040960
  5. 0x0000000065537oracle64040960
  6. 0x01606d3098306oracle64040960
  7. [oracle@361way~]$grepHuge/proc/meminfo
  8. HugePages_Total:0
  9. HugePages_Free:0
  10. HugePages_Rsvd:0
  11. 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的第一步就是进行用户参数限制打通,当前内存大小如下:

--内存信息

  1. [root@361way~]#free-t
  2. totalusedfreesharedbufferscached
  3. Mem:918380205044713336014744152996
  4. -/+buffers/cache:37304881076
  5. Swap:245578802455788
  6. Total:33741682050443169124

修改/etc/security/limits.conf参数文件,添加数据库实例用户的memlock限制.

  1. [root@361way~]#cat/etc/security/limits.conf
  2. #/etc/security/limits.conf
  3. #
  4. (篇幅原因,有省略……)
  5. #-fsize-maximumfilesize(KB)
  6. #-memlock-maxlocked-in-memoryaddressspace(KB)
  7. #-nofile-maxnumberofopenfiles
  8. #ftphardnproc0
  9. #@student-maxlogins4
  10. oraclesoftnproc2047
  11. oraclehardnproc16384
  12. oraclesoftnofile1024
  13. oraclehardnofile65536
  14. oraclesoftmemlock918380
  15. oraclehardmemlock918380
  16. #Endoffile//phpfensi.com

这个过程中使用memlock标记,用于设置每个用户允许的最大内存使用情况,这个取值可以设置为数据库服务器物理内存大小,切换到指定用户(oracle),查看设置.

  1. [oracle@361way~]$ulimit-l
  2. 918380

四、Oracle设置

如果是使用11g Oracle版本,一定需要进行额外的配置,就是将使用的AMM退化为ASMM,在早期的11.2.0.1版本中,这个步骤很重要,因为AMM是不支持HugePage的,如果强在AMM+HugePage模式下打开数据库,是会遇到失败信息.

在最新的11.2.0.2版本以及之后,引入了参数use_large_pages,避免了这样的问题,但是AMM与HugePage不兼容的情况,还是存在.

当前是使用AMM的数据库.

  1. SQL>showparametertarget
  2. NAMETYPEVALUE
  3. -----------------------------------------------------------------------------
  4. archive_lag_targetinteger0
  5. db_flashback_retention_targetinteger1440
  6. fast_start_io_targetinteger0
  7. fast_start_mttr_targetinteger0
  8. memory_max_targetbiginteger360M
  9. memory_targetbiginteger360M
  10. parallel_servers_targetinteger16
  11. pga_aggregate_targetbiginteger0
  12. sga_targetbiginteger0

AMM的关键在于两个方面,一个是memory_target和memory_max_target设置非空,另一个是sga_target和pga_aggregate_target参数设置为空,如果要关闭AMM,退化开启ASMM,就需要进行实例启动参数的设置.

说明:本篇不是以修改AMM到ASMM作为重点,这部分内容略,留待其他文章进行说明,修改之后,需要重启服务器,因为一些参数属于静态参数.

  1. SQL>conn/assysdba
  2. Connected.
  3. SQL>showparametertarget
  4. NAMETYPEVALUE
  5. -----------------------------------------------------------------------------
  6. archive_lag_targetinteger0
  7. db_flashback_retention_targetinteger1440
  8. fast_start_io_targetinteger0
  9. fast_start_mttr_targetinteger0
  10. memory_max_targetbiginteger0
  11. memory_targetbiginteger0
  12. parallel_servers_targetinteger16
  13. pga_aggregate_targetbiginteger108M
  14. sga_targetbiginteger252M

注意,此时共享内存机制才真正实现,我们从ipcs –m中,可以看到真正的共享段.

  1. [oracle@361waydbs]$ipcs-m
  2. ------SharedMemorySegments--------
  3. keyshmidownerpermsbytesnattchstatus
  4. 0x00000000327680oracle640419430427
  5. 0x00000000360449oracle64026004684827
  6. 0x01606d30393218oracle640419430427

五、经验脚本计算HugePage最大值

在MOS 401749.1中,Oracle推荐了一个Shell脚本来计算HugePage值,运行这个脚本,将计算出的取值设置在系统参数中.

  1. [oracle@361wayupload]$ls-l|grephuge
  2. -rwxr-xr-x1oracleoinstall3037Oct2209:42hugepages_settings.sh

执行脚本,注意这个过程中要求Oracle所有实例,包括数据库和ASM都启动、AMM关闭,以及SGA大小超过100M.

  1. [oracle@361wayupload]$./hugepages_settings.sh
  2. Thisscript.isprovidedbyDocID401749.1fromMyOracleSupport
  3. (http://support.oracle.com)whereitisintendedtocomputevaluesfor
  4. therecommendedHugePages/HugeTLBconfigurationforthecurrentshared
  5. memorysegments.Beforeproceedingwiththeexecutionpleasenotefollowing:
  6. *ForASMinstance,itneedstoconfigureASMMinsteadofAMM.
  7. *The'pga_aggregate_target'isoutsidetheSGAand
  8. youshouldaccommodatethiswhilecalculatingSGAsize.
  9. *IncaseyouchangestheDBSGAsize,
  10. asthenewSGAwillnotfitinthepreviousHugePagesconfiguration,
  11. ithadbetterdisablethewholeHugePages,
  12. starttheDBwithnewSGAsizeandrunthescript.again.
  13. Andmakesurethat:
  14. *OracleDatabaseinstance(s)areupandrunning
  15. *OracleDatabase11gAutomaticMemoryManagement(AMM)isnotsetup
  16. (SeeDocID749851.1)
  17. *Thesharedmemorysegmentscanbelistedbycommand:
  18. #ipcs-m//phpfensi.com
  19. PressEntertoproceed...
  20. 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.

  1. [oracle@361way~]$ipcs-m
  2. ------SharedMemorySegments--------
  3. keyshmidownerpermsbytesnattchstatus
  4. 0x0000000032768oracle640419430426
  5. 0x0000000065537oracle64026004684826
  6. 0x01606d3098306oracle640419430426
  7. [oracle@361way~]$grepHuge/proc/meminfo
  8. HugePages_Total:67
  9. HugePages_Free:3
  10. HugePages_Rsvd:0
  11. Hugepagesize:4096kB

在meminfo文件中,可以查到HugePages的信息,说明启用成功.

七、概括

普通物理内存的块大小是4KB,当物理内存扩展到了8GB以后,所需要管理的内存块的数量大大增加,然而使用内存都需要花费CPU资源,也就是说程序所用到的内存块数量越多,系统的管理效率就越低,使用的内存总量过大的情况下还可能会导致分配失败的情况,而且在内存分配的时候就越会导致CPU资源占用率高.

在Linux系统上对于大内存(Very Large Memory)的情况,提供了Hugepages的技术,就是使用比较大的内存页面来进行管理,这样的话,对于现今的高端机型,16GB、32GB的内存来说也能够比较轻易应付,在Redhat Linux系统上,一个内存页面的尺寸是2MB.

相关广告
  • Linux系统HugePage内存功能配置详解 Linux系统HugePage内存功能配置详解 Linux系统HugePage内存功能配置详解
相关阅读

Linux系统HugePage内存功能配置详解

2019/10/10 17:45:03 | 谷歌SEO算法 | SEO技术