一、什么是大页
系统进程是通过虚拟地址访问内存,但是CPU必须把它转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。
而在Redhat Linux中,内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。这种增大的内存页尺寸在Linux 2.1中,称为Big page;在AS 3/4中,称为Hugepage。
二、大页的作用
1、 Linux默认块大小是4K,假设SGA大小为64G,则
SQL> select 64*1024*1024/4 as "KB/Block" from dual;
KB/Block
----------
16777216 --页表大小16M
2、 如果启用大页,块大小该成2M(只能开启2M,不能改别的!),则
SQL> select 64*1024/2 as "M/Block" from dual;
M/Block
----------
32768 --页表大小0.032M
3、 Linux每个进程页表独立,如果有1000个进程,则
没开启大页前16*1000
开启大页后0.032*1000
三、什么条件使用大页
如果系统有大量的物理内存(大于64G,SGA > 32G),则无论物理32位的操作系统还是64位的,都应该使用Hugepage。
注意:使用Hugepage内存是共享内存,它会一直keep在内存中的,不会被交换出去,也就是说使用hurgepage的内存不能被其他的进程使用,所以,一定要合理设置这个值,避免造成浪费。对于只使用Oracle的服务器来说,把Hugepage_pool设置成大于SGA大小才能被Oracle使用。
四、如何设置开启大页
1、 查看大页是否开启
more /proc/meminfo |grep Huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
--说明没有开启大页
Note:proc内核文件目录
2、11G开启大页前需要关闭AMM
SQL> show parameter mem
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 0
memory_target big integer 0
shared_memory_address integer 0
--默认这两个值为0,如果这两个值不为0,则重置这两个值(不能直接设置为0):
Alter system reset memory_max_target(重启后设置下一个)
Alter system reset memory_ target
3、查询SGA_MAX大小
SQL> showparameter sga_max
NAME TYPE VALUE
------------------------------------ -----------------------------------------
sga_max_size big integer 900M
--大页总要比SGA大一点才能生效!
4、查看大页系统参数
sysctl -a |grep huge
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.hugetlb_shm_group = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0
note:sysctl –a显示所有参数
5、 修改大页
vi /etc/sysctl.conf
加入vm.nr_hugepages=455
sysctl –p --使内核参数生效
6、 重启数据库,查看大页是否生效
more /proc/meminfo
HugePages_Total: 455
HugePages_Free: 455
HugePages_Rsvd: 0
HugePages_Surp: 0
--说明还没有生效
7、设置内存锁
vi /etc/security/limits.conf
加入oracle soft memlock 910000(或者设置成-1【无限制】)
oracle hard memlock 910000(或者设置成-1)
8、 切换oracle用户,查询内存锁是否生效
ulimit -l
910000 --说明已经生效
9、 退出oracle用户,重启启动数据库,使用more/proc/meminfo观察
HugePages_Total: 455 --总共大页数
HugePages_Free: 424 --空闲页数,使用了2*(455-424)=64<sga_target
HugePages_Rsvd: 420 --承诺分配给oracle页数420*2+62=901约等于sga_max_target
HugePages_Surp: 0
五、目前发现开启大页的弊端
开启大页后不能启用AMM!(默认是不开启的)