`

SHMMAX参数与SGA空间分配

 
阅读更多

Oracle Instance实例就是Oracle数据库服务器上一块可共享内存和一系列的背景进程。在Windows环境和Unix/Linux环境中,实现Oracle实例的方式存在很大差异。Windows环境由于自身的特点,Oracle实例中的共享内存和多进程模型被实现为单进程多线程模型。此时的共享内存SGA被实现为进程OracleService.exe的专享区域。

 

而在Unix/Linux下,Oracle实例是被实现为多进程模型的,多进程之间通过信号量(semaphore)和共享内存(shared memory)进行通信。在这个过程中,操作系统层面要进行更多的共享内存和信号量管理工作。本篇,我们就研究一下操作系统的shmmax参数含义和与SGA分配的关系。

 

 

1、Oracle实例启动和共享内存

 

回顾两个问题:

 

ü       在Oracle Startup的时候,要经历三个阶段:unmount、mount和open。在unmount阶段,Oracle会进行实例的创建和整理工作。具体来说包括:参数文件init.ora读取、backgroup process创建和共享内存SGA分配;

ü       我们在安装Unix/Linux版本的Oracle时,是需要手工配置一些参数内容。其中就有shmmax参数的配置。该参数的作用就是定义Unix/Linux环境一次可以分配的最大共享段segment的大小;

 

配置shmmax参数就在/etc/sysctl.conf中。

 

 

[root@bspdev ~]# cat /etc/sysctl.conf

# Kernel sysctl configuration file for Oracle Linux

kernel.sem = 250 32000 100 142

kernel.shmmni = 4096

kernel.shmall = 1073741824

kernel.shmmax = 4294967295

net.core.rmem_default = 262144

(篇幅原因,有省略……)

 

共享内存信息为:

 

 

[root@bspdev ~]# ipcs

 

------ Shared Memory Segments --------

key       shmid     owner     perms     bytes     nattch    status    

0x1e853bdc 32768     grid      660       4096      0                     

0x01606d30 98305     oracle    640       4096      0                     

 

------ Semaphore Arrays --------

key       semid     owner     perms     nsems   

0x00000000 0         root      600       1       

0x00000000 32769     root      600       1       

0xa83075d0 163842    grid      660       104     

0xc05587f0 294915    oracle    640       154     

 

------ Message Queues --------

key       msqid     owner     perms     used-bytes  messages

 

 

 

2、SGA空间分配方式

 

SGA的大小是Oracle实例相关的一个重要方面。在Oracle10g之前,SGA总大小是根据DBA进行手工调整配置。但是进入10g之后,可以使用sga_target参数进行统一划定,其中各个部分组成由Oracle自动根据负载进行动态调整。在11g之后,使用memory_target参数,更进一步的将整个Oracle服务器所有使用空间进行自动化调整。

 

在实例启动的时候,Oracle会从参数文件parameter file中读取需要创建的SGA大小,之后就会向操作系统申请相应的共享空间。在这个过程中,需要结合shmmax参数与SGA参数进行匹配。

 

 

单对于SGA而言,是划分为四个组成部分的:

 

ü       Fixed Portion:是一个固定的分配常量;

ü       Variable Portion:可变部分,大部分的可变部分都是由shared_pool的大小来确定的;

ü       Redo block buffer:是Oracle SGA的redo buffer pool的空间;

ü       Data block buffer:是SGA的buffer cache的空间使用;

 

 

SQL> select * from v$sga;

 

NAME                     VALUE

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

Fixed Size             1250428

Variable Size        222301060

Database Buffers     381681664

Redo Buffers           7135232

 

 

 

3、分配SGA的三种方法

 

简单的说,在SGA分布在物理内存的方式上,存在三种模型:单段(one-segment)、连续多段(contiguous multi-segment)和非连续多段(non-contiguous multi-segment)。

 

在Oracle启动实例,进行共享SGA分配的时候,会依次尝试着三种方法。在每个方法尝试中,分配成功或者最后抛出相关ORA异常。如果出现异常抛出,Oracle会以异常处理的方式,清理错误信息,尝试下一种分配模型。最后,整个SGA会存放在shared memory中,共享内存的各个片段累积和就是sgasize的大小。

 

ü       One-segment单段

 

单段one-segment是sga分配最简单也是最先尝试的一种模型。该模型下,SGA会分配在一个共享内存区域里。采用这种模型时,Oracle会向内存申请分配一块与SGA期望大小相同的共享内存空间。

 

在操作系统层面,oracle相当于调用shmget内核函数进行分配。但是该操作所能分配的最大共享内存大小受到参数shmmax的限制。如果申请的共享内存SGASIZE大小小于或者等于shmmax的大小,这样通常是可以申请到共享内存segment的。

 

但是,如果设置的SGA大小超过了shmmax空间,shmget函数操作就会返回一个错误信息。这样,SGA就需要放在多个共享段multi-shared segment中了。

 

注意两个细节:如果shmget()函数在分配过程中,遇到非空间不够问题,会抛出错误ORA_7306。在分配空间之后,会将共享内存的分配信息计入到ksms.o文件中。这个过程被称为attach过程,如果这个过程出错,系统报错ORA_7307。

 

 

ü       Multi-Segment Contiguously连续多段分配

 

当没有成功的将SGA放置在一个共享内存段时,Oracle会开始尝试放置在多个段中。这个方法有两种类型:一个是连续的分配多段,另一个是非连续的多段分配。首先尝试的是连续contiguously方式的分配。

 

此时,Oracle需要直接访问获取shmmax参数,从而了解到底需要分配多少个共享段。大部分情况下,需要多段分配的场景都是shmmax<sgasize。

 

 

在连续共享段的分配方式下,Oracle会分配SGASIZE/SHMMAX(向下进位)个分区给SGA。由于空间是连续的,所以容纳SGA的时候也是连续存放。

 

对多个分配下去的共享内存,同样存在allocate和attach的过程。在attach到ksms.o文件的时候,只会将分配的第一个共享段首地址放置。其他的共享段都是通过上一个的地址加上空间大小,从而实现连续分配的效果。

 

注意:如果这个分配的共享大小个数超过了SS_SEG_MAX规定的大小数量,那么Oracle会报错ORA_7329。

 

比如:SGASIZE的大小是5G,而shmmax参数为2G。此时系统若有条件进行连续共享段分配,会分配出:2G、2G、1G三个共享段连续排列。

 

如果连续多共享段操作分配失败,Oracle内部会返回错误ORA_7336。那么就意味着第二种分配模型失败。要根据返回错误的具体值进行判定。

 

如果在allocate过程中出现错误,而且返回信息为EINVAL,则直接转入到第三种分配SGA模型中。否则,Oracle会持续报错ORA_7337。

 

 

ü       Multi-Segment Non-Contiguously非连续多段分配

 

第三种分配模型是三种模型中最复杂的一个。首先,Oracle也是会去获取shmmax参数的取值,之后进行一系列复杂的评估过程。按照如下步骤进行:

 

1、Oracle检查是否有一个shared memory segment可以将SGA的fix portion和variable portion两块存放在一起。如果可以,将两个部分放置在一个共享段中;

2、如果步骤一的检查失败,那么转而尝试是否可能将fix portion和variable portion分别放置在两块共享内存上;

3、在这个过程中,如果fix portion要大于shmmax参数,也就意味着不存在单独可以防止fix portion的空间,那么系统报错ORA_7330。如果variable portion要大于shmmax参数,系统报错ORA_7331;

4、Oracle计算容纳进一个shared memory segment的redo block的个数。如果shmmax的大小小于一个redo block的大小,系统报错ORA_7332;

5、同理,Oracle计算容纳进一个shared memory segment的data buffer block的个数。如果shmax的大小小于一个data buffer block,Oracle抛出错误ORA_7333;

6、通过步骤4、5的计算,Oracle获取到容纳redo buffer和data block buffer的共享段的个数。注意,redo buffer和data block buffer的计量方式是通过blocks进行的。所以,使用buffers/(buffers per segment)可以近似获取到容纳的segments个数;

7、SGA四部分分配到需要的segment数量之后,总和就是总的共享segment个数。如果这个综合超过了ss_seg_max参数,报错ORA_7334;

 

经过一系列的计算确定,Oracle最后还是要进行空间的allocate和attach过程。在ksms.o中,会记录上对应的所有segment的头地址和大小信息。

 

在算法中,如果Oracle接收到操作系统级别的错误,首先会抛出ORA_7336错误,之后检查返回错误参数。如果是EINVAL,就抛出错误ORA_7310。否则是ORA_7337。

 

 

4、结论

 

经过三种算法的计算分配,Oracle获取到了和SGASIZE相同的共享内存。之后的过程就是进行信号量semaphore的分配。

 

综合上面的阐述,我们也就理解了shmmax参数在Unix/Linux平台设置的原因。

分享到:
评论

相关推荐

    Oracle安装内核参数设置

    安装oracle内核参数说明及设置  kernel.shmmax  说明:  · Linux进程可以分配的单独共享内存段的大值(byte)  · 64位的linux操作系统,设置应该大于SGA_MAX_TARGET或MEMORY_MAX_TARGET的值/或者1/2的物理...

    浅谈安装ORACLE时在Linux上设置内核参数的含义

    SHMMAX参数:Linux进程可以分配的单独共享内存段的最大值。一般设置为内存总大小的一半。这个值的设置应该大于SGA_MAX_TARGET或MEMORY_MAX_TARGET的值,因此对于安装Oracle数据库的系统,shmmax的值应该比内存的二分...

    IBM WebSphere中间件安装及配置手册——操作系统参数配置

    在安装 IBM WebSphere中间件前,需要修改操作系统内核参数,例如,可以修改 kernel.shmall 和 kernel.shmmax 参数以提高系统的性能。 8. 关闭操作系统不必要的服务 在安装 IBM WebSphere中间件前,需要关闭操作...

    BLOG_Oracle_lhr_【ipcs、ipcrm、sysresv、kernel.shmmax】.pdf

    BLOG_Oracle_lhr_【ipcs、ipcrm、sysresv、kernel.shmmax】.pdfBLOG_Oracle_lhr_【ipcs、ipcrm、sysresv、kernel.shmmax】.pdf

    在linux命令行安装oracle11g

    在 Linux 命令行安装 Oracle 11g 需要满足一定的硬件资源要求,设置内核参数、系统资源限制、网络设置、创建用户组与用户账户、用户环境变量等。只有按照正确的步骤进行安装,才能成功地安装 Oracle 11g。

    Mac 操作技巧

    Mac 操作技巧,里面涵盖了很多大家常用的Mac操作技巧。熟练掌握有助于对Mac更好的理解和提高您的工作效率!

    RedHat Enterprise Linux5.5上安装Oracle10g.pd

    与大多数其他 *NIX 系统不同,Linux 允许在系统启动和运行时修 改大多数内核参数。完成内核参数更改后不必重新启动系统。Oracle 数据库 10g 需要以下 所示的内核参数设置。其中给出的是最小值,因此如果您的系统使用...

    linux下oracle优化

    /sbin/sysctl -a | egrep "kernel.shmall|kernel.shmmax|kernel.shmmn|kernel.sem" 然后比较下表所列出的值 注意:下表显示的是内核参数以及shell 限制所需的最小值。对于生产数据库,Oracle建议去调整这些值使得...

    Oracle11gR2一键式全傻瓜安装包

    Oracle11gR2一键式全傻瓜安装包,完全傻瓜化,完全静默安装,安装过程不需要任何人工干预,机会难得哦

    ansible-role-linux-for-postgresql:在安装PostgreSQL之前以最佳方式配置Linux

    SHMMAX:SHMMAX是一个内核参数,用于定义Linux进程可以分配的单个共享内存段的最大大小。 SHMALL:是另一个kernel_parameter,用于定义系统范围的共享内存页面总数。 巨大的页面:巨大的页面使Linux可以支持大于4...

    linux安装oracle10g完整配置文档

    其中,`kernel.shmall` 和 `kernel.shmmax` 是关键参数,分别表示共享内存的最大值和最小值。`kernel.shmmax` 的值应该是物理内存的一半,建议为 2G。 建立 Oracle 用户和环境变量 在安装 Oracle 10g 之前,需要...

    在Linux系统下Oracle数据库的安装及设计方案.pdf

    然后,需要调整Linux核心参数,编辑修改/usr/src/linux/include/asm/shmparam.h文件,修 改shmmax选项。 Oracle数据库的系统结构和工作机理 Oracle数据库的系统结构主要包括数据库实例、数据库文件、控制文件、...

    源码安装PG.docx

    修改内核参数,包括 fs.file-max、kernel.sem、kernel.shmmni、kernel.shmall、kernel.shmmax、net.ipv4.ip_local_port_range、net.core.rmem_default、net.core.wmem_default、net.core.rmem_max、...

    linux中安装ORACLE10g数据库详细步骤

    2. 设置 kernel.shmmax、kernel.shmall、kernel.shmmni 等参数,以满足 ORACLE10g 数据库的运行要求。 四、创建 ORACLE 安装目录 1. 创建 /u01/app/oracle 目录,用于存放 ORACLE10g 数据库的安装文件。 2. 设置...

    Redhat 6.2 下 oracle 11g R2的安装详解第1/2页

    一、配置系统参数 在安装oracle前我们需要对用到的...kernel.shmmax = 2147483648  kernel.shmmni = 4096 fs.aio-max-nr = 1048576 fs.file-max = 6815744 net.core.rmem_default = 4194304 net.core.rmem_max = 4194

    Redhat as4 上安装oracle10g

    1、配置系统内核参数,以root用户登录,修改在/etc/sysctl.conf文件,在该文件中添加以下参数: kernel.shmall = 2097152 kernel.shmmax = 536870912 (512物理内存的标准) kernel.shmmni = 4096 kernel.sem = 250 ...

    oracle安装.docx

    3. 建立用户并分配到组:`useradd –u 400 -g oinstall -G dba -d /home/oracle –m –r oracle` 4. 设置用户的密码:`passwd oracle` 设置密码为 oracle 二、查看 Oracle 需要的安装包是否已经安装 在安装 Oracle...

    Linux /Unix 共享内存

    在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。 一、应用 共享内存的使用,主要有...

    Centos7静默安装Oracle11g

    我们可以编辑/etc/sysctl.conf文件,并添加相关的设置,例如fs.file-max、kernel.shmall、kernel.shmmax等。然后,我们可以使用sysctl -p命令来让参数生效。 在修改用户限制文件时,我们需要编辑/etc/security/...

    sybase 11.03 for scounix5

    SHMMAX: 输入新值(如:67108864) 退出 2. 激活异步I/O #cd /etc/conf/sdevice.d #vi aio 将“N"改为”Y" #vi suds 将“N"改为”Y" #vi /etc/rc2 在最后一行加入下面一行 /etc/suds_ctrl -a 100 (注意:...

Global site tag (gtag.js) - Google Analytics