内存_大页内存

AMM memory_target<>0 )情况下不能使用大页内存。

 

 

大页内存说明:


分页存储管理,是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从 开始,如第 页、第 1 页等,这些页面或页又是页表的页表项

页表大小 = 页表项个数 × 页表项大小

下例中: 6000 个大页,这 6000 个大页就是 6000 个页号,存放在页表中就要占用 6000 个页表项,一个页表项多大呢,就是多少位, 64 位系统就是 8B ,也就是 8 字节, 6000 页表项 *8 字节 =48KB

在分页系统中的页面其大小应适中。页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。然而,如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。因此,页面的大小应选择得适中,且页面大小应是 2 的幂,通常为 512 B~8 KB

 

页表内存计算

32 位系统下,一个进程访问 1GB 的内存,会产生 1M 的页表,如果是在 64 位系统,将会增大到 2M 很容易推算,如果一个 SGA 设置为 60G ,有 1500 Oracle 用户进程, 64 Linux 的系统上,最大的页表占用内存为: 60*2*1500/1024=175G ,是的,你没看错,是 175G !但是实际情况看到的页表占用可能没有这么大,打个百分之四五十的折扣,这是因为只有服务器进程访问到 SGA 的特定区域后,进程才需要把这一块对应的页表项加入到自己的页表中。

 

 

 

 

大页内存的作用

1 :减少页表大小,一个大页对应连续的 2M 内存, 12G 的内存只要 6000 个大页,而原来需要 24M 页表( 64 位系统一个用户访问 1G 需要 2M 的页表, 2*12=24 ),现在只需要 48KB 64 位系统一个页表项为 8Bytes ,因为 8bytes=64bit

2 :大页内存只能锁定在物理内存中,不能交换到交换区,这样就避免了交换引起的性能问题

3 :由于页表的减少,使得 CPU 中的命中率大大提高

 

 

 

 

OS 层面查看大页使用情况


 

PageTables :页表内存,耗内存 34M

HugePages_Total :大页页面数,和 Hugepagesize 相乘后得到所分配的内存大小。 43000*2/1024 大约为 84GB

HugePages_Free :从来没有被使用过的大页页面数。即使 Oracle sga 已经分配了这部分内存,但是如果没有实际写入,那么看到的还是 Free 的。这是很容易误解的地方。

HugePages_Rsvd :已经被分配预留但是还没有使用的大页页面数。在 Oracle 刚刚启动时,大部分内存应该都是 Reserved 并且 Free 的,随着 Oracle SGA 的使用, Reserved Free 都会不断的降低。

HugePages_Free – HugePages_Rsvd :这部分是没有被使用到的内存,如果没有其他的 Oracle instance ,这部分内存也许永远都不会被使用到,也就是被浪费了。在该系统上有 11.5GB 的内存被浪费了。

Hugepagesize :表示每个大页页面对应的大小

HugePages_Total* Hugepagesize= 大页内存的总量

 

比如大页内存 hugepages 总计 11GB sga_max_size 10G sga_target 8G DB 启动后会根据 sga_max_size 分配 hugepages 内存,这里为 10G ,真正 free hugepages 内存为 11-10=1G ,但是 sga_target 8G ,那么会有 2G 不被访问,则 hugepages_free 2+1=3G hugepage_Rsvd 内存有 2G ,这里实际给其他实例使用的只有 1G ,也就是真正意义上的 free 只有 1G

 

到目前为止,大页内存只能用于共享内存段等少量类型的内存。一旦将物理内存用作大页内存,这些内存就不能用做其他用途,比如作为进程的私有内存,因此不能将过多的内存设置为大页内存, 通常将大页内存的页数设置为:

Hugepage_total=ceil sga_max_size/hugepagesize +2

比如 SGA_MAX_SIZE=18G hugepagesize=2048kb ,则大页内存的页数 =ceil(18*1024/2)+2=9218

 

 

 

 

 

配置大页内存的方法

1.       查看内存是否支持大页内存,查看 /proc/meminfo 是否有 PageTables HugePages_Total 等项,如果没有则需要在内核配置CONFIG_HUGETLBFS=y、CONFIG_HUGETLB_PAGE=y支持大内存页


2.       修改 /etc/sysctl.conf 文件,设置大页内存的页面数,增加如下,再执行 sysctl –p 使之生效,再检查 /proc/meminfo 查看 hugepages_total 如果小于设置的值,则说明没有足够的连续物理内存用于这些大页内存,需要重启服务器使之生效

vm.nr_hugepages=9218

To determine the default large page size, run the following command:

# grep Hugepagesize /proc/meminfo

For example, if /proc/meminfo lists the large page size as 2 MB, and the total SGA size for the instance is 1.6 GB, then set the value for the vm.nr_hugepages kernel parameter to 820 (1.6 GB / 2 MB = 819.2).


3.       /etc/security/limits.conf 文件中增加如下行 (oracle 用户可以锁定的内存大小,单位 KB)

oracle soft memlock 18878464

oracle hard memlock 18878464

 Edit the memlock setting in the /etc/security/limits.conf file. The memlock setting is specified in KB and set slightly lesser than the installed RAM. For example, if you have 64GB RAM installed, add the following entries to increase the max locked memory limit:

* soft memlock 60397977

* hard memlock 60397977

You can also set the memlock value higher than your SGA requirements.



可能因为没有配置大页内存导致的故障现象

1.       CPU100% ,但是 user% 不高,只是 sys% 非常高

2.       /proc/meminfo 显示 PageTables 页表非常大好几个 G


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2105962/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30126024/viewspace-2105962/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值