如何使linux扩展使用 大内存

HugePages在linux kernel 2.6被完整引进,其目的是为了提供更大的内存页面以便于更好的支持大内存。uname  -a

       在linux中,默认的内存页面是4096字节,而现行物理设备中,内存动辄几十G,当系统运行内存较大的应用程序(比如数据库)时,过小的内存页面会产 生大量的TLB miss和缺页中断,将大大降低程序性能。Hugepages提供了2M到256M的大内存页面(大小取决于内核版本和物理架构)来代替默认的页面大小.

       使用Hugepages可以得到更好的性能,因为Hugepages不可交换,可以避免内存的换入换出,对一个Oracle database,可以将使用的SGA作为Hugepages钉住,会整体上提升db的性能。Oracle推荐在64bit Linux上对大内存数据库使用Hugepages.

      
       以RHEL4 64bit为例,配置Hugepages过程如下:

1 更改os参数,配置Hugepages大小

      Hugepages需设置为比SGA略大一点,过大的设置会造成内存浪费,过小则会造成无法使用。

(1)修改/etc/sysctl.conf参数,增加vm.nr_hugepages=”/< Hugepagesize>”,并使之生效

      注意vm.nr_hugepages的单位,其值为需要设置成Hugepages的总内存大小/Hugepages的页面大小.

      HugePages的页面大小可以这样获得:

[root@jss01 ~]# grep Hugepagesize /proc/meminfo

Hugepagesize: 2048 kB

(2) 修改/etc/security/limits.conf,增加locked memory的最大限制,设置成大于等于sga大小。

* soft memlock

* hard memlock

2.重新启动db,检查是否生效

[root@jss01 ~]# grep Huge /proc/meminfo

HugePages_Total: 4000

HugePages_Free: 0

Hugepagesize: 2048 kB

      HugePages_Free表示剩余的大内存页面数,应该是接近为0的数字。

     在32bit OS中,使用Hugepages是为了配合大内存扩展,由于32bit OS的寻址空间限制,使用的SGA有限。尽管可以通过降低Oracle软件的mapped_base(挂载地址)来实现sga的扩展,但无法突破4G制 约。而通过VLM (Very Large Memory)技术,hugemem内核的OS可以将SGA最大内存扩展到62Gb(smp内核最大支持14Gb SGA).在kernel 2.6之后,实现VLM可以借助hugepages+in-memory filesystem (ramfs)。

     需注意的是,使用VLM,将不能使用SGA自动动态调整功能。

      以RHEL4 32bit为例,具体步骤如下:

1.创建ramfs

[root@jss01 ~]umount /dev/shm

[root@jss01 ~]mount -t ramfs ramfs /dev/shm

[root@jss01 ~]chown oracle:oinstall /dev/shm

2.配置os参数和Hugepages大小(步骤略,同上)

3.配置db parameter

      32bit扩展大内存需要牺牲掉一些特性,参数文件里面,需要做如下改动:

(1) 移除DB_CACHE_SIZE/DB_xK_CACHE_SIZE等参数,用以老参数DB_BLOCK_BUFFERS代替。

(2) 设置 USE_INDIRECT_DATA_BUFFERS=TRUE

(3) 移除sga_target(11g memory_target/memory_max_target)等参数

4.重启instance/验证

       对于不存在Hugepages功能的更早的一些内核版本(比如RHAS 2,可以通过bigpages+in-memory filesystem(shmfs)来实现大内存扩展.

     注意,与在32bit下VLM使用Hugepages不同的是,在64bit Linux下使用Hugepages并不需要修改数据库参数。当然,在物理设备飞速发展的今天,还是尽快升级到你手头的32bit OS到64bit OS上来吧,何必在去为一些内存扩展苦苦折腾.

你可能感兴趣的:(操作系统)