Linux下HugePage内存功能配置

 

在Linux环境性能优化实践中,HugePage是一个经常提到的方法。简单的说,HugePage就是Linux内核上一种是用内存块的方法。作为传统4K Page的替代,HugePage在大部分场景下可以提升Oracle实例的运行性能效率。

 

本篇介绍如何进行HugePage配置和Oracle环境使用。

 

1、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优化的问题。

 

2、基础环境准备

 

我们选择RedHat 5.3版本,也就是Kernel2.6进行实验。

 

 

[oracle@SimpleLinux ~]$ uname -r

2.6.18-128.el5

 

 

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

 

 

[oracle@SimpleLinux ~]$ ipcs -m

 

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status     

0x00000000 32768      oracle    640        4096       0                      

0x00000000 65537      oracle    640        4096       0                      

0x01606d30 98306      oracle    640        4096       0 

 

[oracle@SimpleLinux ~]$ grep Huge /proc/meminfo

HugePages_Total:     0

HugePages_Free:      0

HugePages_Rsvd:      0

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显示的虚拟空共享段就是实际效果的一部分。

 

2、设置用户内存配置

 

启用HugePage的第一步就是进行用户参数限制打通,当前内存大小如下:

 

 

--内存信息

[root@SimpleLinux ~]# free -t

             total       used       free     shared    buffers     cached

Mem:        918380     205044     713336          0      14744     152996

-/+ buffers/cache:      37304     881076

Swap:      2455788          0    2455788

Total:     3374168     205044    3169124

 

 

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

 

 

[root@SimpleLinux ~]# cat /etc/security/limits.conf

# /etc/security/limits.conf

#

(篇幅原因,有省略……)

#        - fsize - maximum filesize (KB)

#        - memlock - max locked-in-memory address space (KB)

#        - nofile - max number of open files

 

#ftp             hard    nproc           0

#@student        -       maxlogins       4

 

oracle soft nproc 2047

oracle hard nproc 16384

oracle soft nofile 1024

oracle hard nofile 65536

 

oracle soft memlock 918380

oracle hard memlock 918380

# End of file

 

 

这个过程中使用memlock标记,用于设置每个用户允许的最大内存使用情况。这个取值可以设置为数据库服务器物理内存大小。

 

切换到指定用户(oracle),查看设置。

 

 

[oracle@SimpleLinux ~]$ ulimit -l

918380

 

 

3、Oracle设置

 

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

 

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

 

当前是使用AMM的数据库。

 

 

SQL> show parameter target

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

archive_lag_target                   integer     0

db_flashback_retention_target        integer     1440

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     0

memory_max_target                    big integer 360M

memory_target                        big integer 360M

parallel_servers_target              integer     16

pga_aggregate_target                 big integer 0

sga_target                           big integer 0

 

 

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

 

说明:本篇不是以修改AMM到ASMM作为重点,这部分内容略,留待其他文章进行说明。

 

修改之后,需要重启服务器,因为一些参数属于静态参数。

 

SQL> conn / as sysdba

Connected.

SQL> show parameter target

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

archive_lag_target                   integer     0

db_flashback_retention_target        integer     1440

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     0

memory_max_target                    big integer 0

memory_target                        big integer 0

parallel_servers_target              integer     16

pga_aggregate_target                 big integer 108M

sga_target                           big integer 252M

 

 

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

 

 

[oracle@SimpleLinux dbs]$ ipcs -m

 

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status     

0x00000000 327680     oracle    640        4194304    27                     

0x00000000 360449     oracle    640        260046848  27                     

0x01606d30 393218     oracle    640        4194304    27

 

 

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

 

在MOS 401749.1中,Oracle推荐了一个Shell脚本来计算HugePage值。运行这个脚本,将计算出的取值设置在系统参数中。具体脚本请见笔者博客文件下载栏目。

 

 

[oracle@SimpleLinux upload]$ ls -l | grep huge

-rwxr-xr-x 1 oracle oinstall   3037 Oct 22 09:42 hugepages_settings.sh

 

 

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

 

 

[oracle@SimpleLinux upload]$ ./hugepages_settings.sh

 

This script. is provided by Doc ID 401749.1 from My Oracle Support

(http://support.oracle.com) where it is intended to compute values for

the recommended HugePages/HugeTLB configuration for the current shared

memory segments. Before proceeding with the execution please note following:

 * For ASM instance, it needs to configure ASMM instead of AMM.

 * The 'pga_aggregate_target' is outside the SGA and

   you should accommodate this while calculating SGA size.

 * In case you changes the DB SGA size,

   as the new SGA will not fit in the previous HugePages configuration,

   it had better disable the whole HugePages,

   start the DB with new SGA size and run the script. again.

And make sure that:

 * Oracle Database instance(s) are up and running

 * Oracle Database 11g Automatic Memory Management (AMM) is not setup

   (See Doc ID 749851.1)

 * The shared memory segments can be listed by command:

     # ipcs -m

 

 

Press Enter to proceed...

 

Recommended setting: vm.nr_hugepages = 67

 

 

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

 

 

--设置参数

[root@SimpleLinux ~]# vi /etc/sysctl.conf

 

(添加内容如下……)

vm.nr_hugepages = 67

"/etc/sysctl.conf" 49L, 1325C written

 

 

使用sysctl –p生效设置。

 

 

[root@SimpleLinux ~]# sysctl -p

net.ipv4.ip_forward = 0

(篇幅原因,有省略……)

net.core.wmem_max = 1048586

vm.nr_hugepages = 67

 

 

5、HugePage启动检验

 

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

 

 

[oracle@SimpleLinux ~]$ ipcs -m

 

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status      

0x00000000 32768      oracle    640        4194304    26                     

0x00000000 65537      oracle    640        260046848  26                     

0x01606d30 98306      oracle    640        4194304    26 

 

 

[oracle@SimpleLinux ~]$ grep Huge /proc/meminfo

HugePages_Total:    67

HugePages_Free:      3

HugePages_Rsvd:      0

Hugepagesize:     4096 kB

 

 

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

 

6、总结

 

随着Linux+PC的服务器模式普及,我们会在实际工作中见到越来越多的Linux服务器和遇到越来越多的Linux系统。HugePage作为一种常用的性能优化手段,需要关注学习。

 

时间: 2024-10-22 06:34:45

Linux下HugePage内存功能配置的相关文章

Linux下针对路由功能配置iptables的方法详解

  作为公司上网的路由器需要实现的功能有nat地址转换.dhcp.dns缓存.流量控制.应用程序控制,nat地址转换通过iptables可以直 接实现,dhcp服务需要安装dhcpd,dns缓存功能需要使用bind,流量控制可以使用tc,应用程序控制:例如对qq的封锁可以使用 netfilter-layer7-v2.22+17-protocols-2009-05-28.tar.gz来实现 1.网络规划 操作系统是centos5.8 2.安装dhcpd 代码如下: yum install dhcp

Linux下NDK的安装配置

Linux下NDK的安装配置     在编写android程序的时候如果需要复用一部分以前的c语言程序,可以考虑使用NDK.由于设计到c和c++编程,故强烈建议在Linux下安装上eclipse的CDT插件.安装方法同安装其他插件的方式一样,推荐离线安装,方法这里不再赘述.     在使用NDK之前需要下载android-ndk包,下载解压后将解压后的文件夹拷贝到自定义的目录下面(如"/root/"目录下),如图一所示.   图一  拷贝解压后的ndk文件夹到自定义目录下      

让你提前认识软件开发(51):VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改

第3部分 软件研发工作总结 VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改   [文章摘要]         Pclint是一种C/C++软件代码静态分析工具.它是一种更加严格的编译器,能够发现普通编译器所不能发现的代码中的很多问题,因此被广泛应用于软件开发项目中.        本文介绍了如何在VC++集成开发环境中配置Linux下的Pclint工程,给出了C语言中pclint规则A检查的常见错误,并描述了对应的修改办法.   [关键词]          VC++

Linux下Kafka单机安装配置方法(图文)_Linux

介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: •Kafka将消息以topic为单位进行归纳. •将向Kafka topic发布消息的程序成为producers. •将预订topics并消费消息的程序成为consumer. •Kafka以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个broker. producers通过网络将消息发送到Kafka集群,集群

linux下查看内存

前言:在Linux上不像在Windows上看内存那样方便,而且还有Swap这个新的概念,所以知道如何来看Linux内存还是有一定意义的. 在Linux下查看内存我们一般用command free [root@nonamelinux ~]# free total used free shared buffers cached Mem: 386024 377116 8908 0 21280 155468 -/+ buffers/cache: 200368 185656 Swap: 393552 0

阿里云Linux下FTP服务器搭配配置

  阿里云服务器是国内目前 最好的一个云服务器了,不过价格方面也比较贵了,下面我们来给各位介绍在阿里云Linux下FTP服务器搭配配置了,大概方法 与linux下搭配ftp服务器区别不大,只是一些小细节了. 一.aliyun Linux(Redhat)安装vsftp软件 1.更新yum源 首先需要更新系统的yum源,便捷工具下载地址:update_source.zip.这里需要注意的是,目前文件无法传输,所以想要运行 update_source.sh 只能用文本打开,复制粘贴到阿里云服务器系统运

linux下php环境的配置

问题描述 linux下php环境的配置 在/etc/httpd/conf/httpd.conf下也加了LoadModule php5 modules/libphp.so在/etc/httpd/conf.d/php.conf也加了AddType application/x-httpd-php .php,apache服务也重启了,还是不行!!!! 解决方案 Linux下配置安装PHP环境http://www.cnblogs.com/lufangtao/archive/2012/12/30/28396

Linux下防火墙的简单配置与插入规则介绍_Linux

查看当前的防火墙设置 iptables -L INPUT -n --line-numbers 删除一条策略,例如第4行策略 iptables -D INPUT 4 -A:在尾部插入 -I (insert)在指定链中插入一条新规则,为指明插入到第几行 (如:在第七行插入) iptables -I INPUT 7 -p tcp -m state --state NEW -m tcp --dport 81 -j ACCEPT 然后保存 service iptables save 然后重启 servic

Linux下动态DNS服务配置方法详解

在网络管理中,对于DNS服务的管理是一项基础性的工作.随着用户规模的扩大,频繁地手工修改DNS的区域数据库文件不是一件轻松的工作.关于动态DNS(DDNS)的研究逐渐引起了人们的关注,不同的平台都推出了自己的解决方案.本文将详细介绍Linux环境下DDNS的解决方案,即由Internet Software Consortium(ISC)开发的BIND-DNS和DHCP(Dynamic Host Configure Protocol,动态主机配置协议)协同工作,进而共同实现DDNS的方法. 在Li