打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux下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版本进行实验。

  1. [oracle@361way ~]$ uname -r
  2. 2.6.18-128.el5

此时Oracle实例为11gR2(11.2.0.3),运行在AMM内存管理方式下。共享内存段信息如下。

  1. [oracle@361way ~]$ ipcs -m
  2. ------ Shared Memory Segments --------
  3. key shmid owner perms bytes nattch status
  4. 0x00000000 32768 oracle 640 4096 0
  5. 0x00000000 65537 oracle 640 4096 0
  6. 0x01606d30 98306 oracle 640 4096 0
  7. [oracle@361way ~]$ grep Huge /proc/meminfo
  8. HugePages_Total: 0
  9. HugePages_Free: 0
  10. HugePages_Rsvd: 0
  11. Hugepagesize: 4096 kB

注意两个问题:一个是当前我们在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. --内存信息
  2. [root@361way ~]# free -t
  3. total used free shared buffers cached
  4. Mem: 918380 205044 713336 0 14744 152996
  5. -/+ buffers/cache: 37304 881076
  6. Swap: 2455788 0 2455788
  7. Total: 3374168 205044 3169124

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

  1. [root@361way ~]# cat /etc/security/limits.conf
  2. # /etc/security/limits.conf
  3. #
  4. (篇幅原因,有省略……)
  5. # - fsize - maximum filesize (KB)
  6. # - memlock - max locked-in-memory address space (KB)
  7. # - nofile - max number of open files
  8. #ftp hard nproc 0
  9. #@student - maxlogins 4
  10. oracle soft nproc 2047
  11. oracle hard nproc 16384
  12. oracle soft nofile 1024
  13. oracle hard nofile 65536
  14. oracle soft memlock 918380
  15. oracle hard memlock 918380
  16. # End of file

这个过程中使用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> show parameter target
  2. NAME TYPE VALUE
  3. ------------------------------------ ----------- ------------------------------
  4. archive_lag_target integer 0
  5. db_flashback_retention_target integer 1440
  6. fast_start_io_target integer 0
  7. fast_start_mttr_target integer 0
  8. memory_max_target big integer 360M
  9. memory_target big integer 360M
  10. parallel_servers_target integer 16
  11. pga_aggregate_target big integer 0
  12. sga_target big integer 0

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

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

  1. SQL> conn / as sysdba
  2. Connected.
  3. SQL> show parameter target
  4. NAME TYPE VALUE
  5. ------------------------------------ ----------- ------------------------------
  6. archive_lag_target integer 0
  7. db_flashback_retention_target integer 1440
  8. fast_start_io_target integer 0
  9. fast_start_mttr_target integer 0
  10. memory_max_target big integer 0
  11. memory_target big integer 0
  12. parallel_servers_target integer 16
  13. pga_aggregate_target big integer 108M
  14. sga_target big integer 252M

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

  1. [oracle@361way dbs]$ ipcs -m
  2. ------ Shared Memory Segments --------
  3. key shmid owner perms bytes nattch status
  4. 0x00000000 327680 oracle 640 4194304 27
  5. 0x00000000 360449 oracle 640 260046848 27
  6. 0x01606d30 393218 oracle 640 4194304 27

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

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

  1. [oracle@361way upload]$ ls -l | grep huge
  2. -rwxr-xr-x 1 oracle oinstall 3037 Oct 22 09:42 hugepages_settings.sh

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

  1. [oracle@361way upload]$ ./hugepages_settings.sh
  2. This script. is provided by Doc ID 401749.1 from My Oracle Support
  3. (http://support.oracle.com) where it is intended to compute values for
  4. the recommended HugePages/HugeTLB configuration for the current shared
  5. memory segments. Before proceeding with the execution please note following:
  6. * For ASM instance, it needs to configure ASMM instead of AMM.
  7. * The 'pga_aggregate_target' is outside the SGA and
  8. you should accommodate this while calculating SGA size.
  9. * In case you changes the DB SGA size,
  10. as the new SGA will not fit in the previous HugePages configuration,
  11. it had better disable the whole HugePages,
  12. start the DB with new SGA size and run the script. again.
  13. And make sure that:
  14. * Oracle Database instance(s) are up and running
  15. * Oracle Database 11g Automatic Memory Management (AMM) is not setup
  16. (See Doc ID 749851.1)
  17. * The shared memory segments can be listed by command:
  18. # ipcs -m
  19. Press Enter to proceed...
  20. Recommended setting: vm.nr_hugepages = 67

将计算出的67更改参数/etc/sysctl.conf

  1. --设置参数
  2. [root@361way ~]# vi /etc/sysctl.conf
  3. (添加内容如下……)
  4. vm.nr_hugepages = 67
  5. "/etc/sysctl.conf" 49L, 1325C written

使用sysctl –p生效设置。

  1. [root@361way ~]# sysctl -p
  2. net.ipv4.ip_forward = 0
  3. (篇幅原因,有省略……)
  4. net.core.wmem_max = 1048586
  5. vm.nr_hugepages = 67

六、HugePage启动检验

设置之后,最好重新启动服务器,包括Oracle。

  1. [oracle@361way ~]$ ipcs -m
  2. ------ Shared Memory Segments --------
  3. key shmid owner perms bytes nattch status
  4. 0x00000000 32768 oracle 640 4194304 26
  5. 0x00000000 65537 oracle 640 260046848 26
  6. 0x01606d30 98306 oracle 640 4194304 26
  7. [oracle@361way ~]$ grep Huge /proc/meminfo
  8. HugePages_Total: 67
  9. HugePages_Free: 3
  10. HugePages_Rsvd: 0
  11. Hugepagesize: 4096 kB

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

七、概括

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

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



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
系统投产前,Oracle数据库优化思路和9个典型问题
如何使linux扩展使用 大内存
eagle’s home ? Blog Archive ? Linux Hugepages
ORACLE技术中国用户讨论组 - Oracle开发应用 - TNS-12500解决过程(zt) - powered by ORACLE USER GROUP
对oracle实例的内存(SGA和PGA)进行调整,优化数据库性
oracle 11g 关于内存的分配方案。
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服