hugepage oracle 12c,Oracle12c ASMM和hugepage

在Oracle 12c,测试发现默认并不启用AMM 特性,而是使用了ASMM。因为在X86 架构下的linux 平台中,配置hugepage时,也是需要关闭AMM,使用ASMM特性。

AMM分配内存的方式是在/dev/shm创文件的方式,每个文件大小为granule大小.这种方式和使用huge page的方式不兼容,所以使用huge page必须要禁掉amm.而使用asmm的方式,是使用传统的共享内存方式.

在以前使用huge pages时,需要定义db_block_buffers来定义cache buffer使用huge page的数量.其他的内存组件是不能使用huge page的

现在新增加一个参数,use_large_pages,默认为true,oracle数据库在启动时,先会使用在os层面定义好的huge page数量然后再加上其他的内存,比如现在sga_target=定义了1500M,vm.nr_hugepages=200(MB),会先使用huge page,

再加上其他定义的1100M,这样就避免了只有db_block_buffers使用huge page的情况.

[root@prod dbs]# cat /etc/sysctl.conf | grep vm

vm.nr_hugepages=40

[root@prod dbs]# cat /etc/security/limits.conf | grep memlock  --要大于hugepage的size

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

oracle soft memlock 5000000000

oracle hard memlock 5000000000

SQL> show parameter use_large_pages;

NAME                                 TYPE        VALUE

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

use_large_pages                      string      TRUE

这样实例在启动时,会用光所有可用的hugepage,不足的部分再按正常的内存去分配.

Wed Nov 13 04:01:36 2013

************************ Large Pages Information *******************

Wed Nov 13 04:01:36 2013

Per process system memlock (soft) limit = 4768 GB

Wed Nov 13 04:01:36 2013

Total System Global Area in large pages = 78 MB (9%)

Wed Nov 13 04:01:36 2013

Large pages used by this instance: 39 (78 MB)

Wed Nov 13 04:01:36 2013

Large pages unused system wide = 1 (2048 KB)

Wed Nov 13 04:01:36 2013

Large pages configured system wide = 40 (80 MB)

Wed Nov 13 04:01:36 2013

Large page size = 2048 KB

Wed Nov 13 04:01:36 2013

数据库服务器内存设置——设置大叶内存

数据库服务器的操作系统内核启动大叶内存选项

大叶是2M一个页,默认 是4k一个页

如果数据库连接数很多,每个连接又要访问大量的数据,每个连接对应的进程都要在内存里分空间来存放它所要访问的内存地址映射表,如果这样的进程太多的话,可能会吃掉很多内存

每1G内存所需要的映射表的大小是2.5M,用大叶内存的话只用不到1M

$cat /etc/sysctl.conf | grep huge

vm.nr_hugepages = 45000

$cat /proc/meminfo | grep Huge

HugePages_Total: 45000

HugePages_Free: 6539

HugePages_Rsvd: 4548

HugePages_Surp: 0

Hugepagesize: 2048 kB

机器的连接数?

[oracle@prod ~]$ ps -ef | grep oracle | grep "LOCAL=NO"|wc -l

522

大致估算一下,64位系统下,一个进程如果要在数据库中访问1G数据的话,需要在内存中分配2M的内存,32位的系统需要1M

所以可以计算一下,522个会话,每个会话是一个进程,如果每个进程访问1G的数据的话,操作系统需要500*2, 大约是1G的内存来为这些进程创建映射表

当前正在被使用的映射表占用的内存大小

[oracle@prod ~]$ cat /proc/meminfo | grep PageTable

PageTables: 6383288 kB

当前操作系统内存用于存映射表的大小:6G。

说明如果不开大叶内存的情况下,调整sga的话,至少需要给系统留出来这些内存,否则系统可能因为内存耗尽

也就是我这个物理内存64G,不开大叶内存的情况下,至少留个系统6G多。

按照计算,1个进程如果访问1G数据的话需要2M左右的内存做为映射表,这个机器上有522个会话,映射表总大小是6G,

说明每个会话平均访问的数据量是5.8G左右

所以调整sga的时候注意一下,记得给操作系统留出足够的内存

你可能感兴趣的:(hugepage,oracle,12c)