ITPub博客

首页 > 数据库 > Oracle > 内存_大页内存

内存_大页内存

原创 Oracle 作者:lusklusklusk 时间:2016-05-24 13:58:29 0 删除 编辑

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 等项


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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 内存_SGA
请登录后发表评论 登录
全部评论
Welcome to Lukes DB HOME。11G OCM, 5年以上DBA工作经验,博客仅记录自己的一个学习过程,不代表完全准确,如有需要,欢迎转载。

注册时间:2015-02-02

  • 博文量
    349
  • 访问量
    350628