2位Linux设置超大Oracle SGA的分析时间
有不少用户认为在32位Linux,只能设置约1.7GB的Oracle SGA。也有不少用户在不同的Linux发行版中使用相同的配置过程,获得了不同的SGA最大值,便认为某些Linux发行版存在问题。这些想法都比较片面。实际上 32位Linux上Oracle SGA 的容量取决于三个指标,即:Linux kernel 版本、Oracle Database 版本、Linux 内核参数shmmax。这里跟据一些网上文章做了些查正,做一些分析吧。
一、内核版本的影响
在32位Linux平台,至少都有两套内核供用户使用。一个是smp核心,一个是hugemem核心。两个核心的区别在于直接映射的内核数据代码地址空间的区别:
SMP 核心:
在x86架构下,虚拟地址空间的大小为4G。在这4G空间中,用户空间占3G (0×00000000到0xbfffffff),核心空间占1G(0xc0000000到0xffffffff)。这样的分配策略称为3G/1G分配。
具体的分配方式如下:
1. 0GB-1GB User space - Used for text/code and brk/sbrk allocations (malloc uses brk for small chunks)
2. 1GB-3GB User space - Used for shared libraries, shared memory, and stack; shared memory and malloc use mmap (malloc uses mmap for large chunks)
3. 3GB-4GB Kernel Space - Used for the kernel itself
这种分配方式对于拥有1G物理内存以下的系统是没有任何问题的,即使超过1G物理内存,3G/1G分配策略也没有什么问题,因为内核可以在高端内存区域 (物理地址1G以上的内存)中存放一些内核数据结构(比如页缓冲等)。
然而,随着物理内存的增多,3G/1G分配策略的问题也逐渐会暴露出来。这是因为一些关键的内核数据结构 (比如用于管理物理内存的mem_map[]) 是存放在1G核心空间之内的。对于32G内存的系统,mem_map[]会占用近 0.5G的低端内存(物理地址896M以下的内存),这样留给核心其他部分的内存就不到所有内存的1.5%;而对于64G内存的系统,mem_map[] 本身就会耗尽所有的低端内存,造成系统无法启动。但是把mem_map[]放到高端内存的做法也不太实际,因为mem_map[]和内存管理,体系结构相关底层实现,文件系统以及驱动等几乎所有的核心的关键部分均有联系,这时候就需要使用hugemem核心了。
hugemem 核心:
与SMP的3G/1G策略不同,hugemem 使用4G/4G分配方式。可以使核心空间由1G增加到4G,而用户空间也由3G增加到4G。
相比3G/1G分配策略,对于4G物理内存系统,使用4G/4G分配可以增加低端内存达3倍以上,而对于32G物理内存系统,则会有更多的提升,达到原来的6倍。 理论上,4G/4G策略可以支持物理内存达200G的x86系统(如果硬件没有限制的话),即使对于这样的系统,4G/4G策略也能保证留有1G可用的低端内存。
不论能否理解上面的解释,只须要记住 smp 和 hugemem 两个核心,一个是 3G/1G策略,一个是4G/4G策略即可。
二、Oracle Database 版本:
Oracle SGA 是挂载在内存用户空间中,不同版本的 Oracle Database ,挂载SGA起始地址是不同的:
Oracle 10g Release 1:挂载SGA的起始地址为0×50000000(1.25GB)
Oracle 10g Release 2:挂载SGA的起始地址为0×20000000(0.5GB)
(其它版本未查正,有兴趣可以自已看看Oracle手册)
从这个结果可以看出,理论上若使用3G/1G的smp核心,Oracle 10g Release 1 的SGA可设置到 3GB - 1.25 = 1.75GB 。正是因此,也有人认为Oracle SGA 只能设置到 1.75GB。而升级至 R2 版本,则可以设置到 3GB - 0.5GB = 2.5GB 。相同的,使用 4G/4G 的hugemem 核心能够获得多大的SGA 就很清楚了。
三、kernel shmmax 参数:
shmmax定义单个共享内存段的最大值,它的取值范围区间是[0,4294967295], 单位为byte,4294967295 bytes即4294967296 bytes(4GB)减去1。一般来说,它应该足够大以容下整个SGA,避免SGA使用多个共享内存段造成Oracle性能下降。
那么,将shmmax设置为最大值4294967295,使用 hugmemem 核心,Oracle 10g R2 版本,则理论上的SGA最大值为 3.5GB。
尽管用户进程可用的虚拟地址空间为4GB以及shmmax的最大值为4294967295,仍然可以通过使用内存文件系统(in-memory filesystem,比如tmpfs、ramfs以及hugetlbfs)打开Oracle的Very Large Memory (VLM)特性来扩展SGA超过4GB,比如6GB。但是这种方法有个不方便的地方是,用户不能够再使用Oracle 10g中的Automatic Shared Memory Management了。
总结一下:
SMP核心和hugemem核心的影响:
SMP核心:1GB+3GB,SGA最大值为1.75GB(3GB-1.25GB)
Hugemem核心:4GB+4GB , SGA最大值为2.75GB(4GB-1.25GB)
Oracle 不同版本的影响:
Oracle 10g Release 1:挂载SGA的起始地址为0×50000000(1.25GB)
Oracle 10g Release 2:挂载SGA的起始地址为0×20000000(0.5GB)
那么:
Hugemem 核心 + Oracle 10g Release 2 ,SGA最大值为3.5GB(4GB-0.5GB)
BTW:由于64位系统对应16EB寻址范围,而不是32位系统的4GB,所以想要获得更大SGA,性能更好的效果,应该优先使用 64 位系统,而不是通过32系统配合内存文件系统来配置了。
分享到:
相关推荐
"Oracle SGA 参数调整导致数据库启动异常处理方法" 在 Oracle 数据库中,SGA(System Global Area)参数调整可能会导致数据库启动异常。这种情况下,需要了解 SGA 参数的调整方法和恢复数据库的方法。 一、SGA ...
在 Linux 环境中,为了正确运行 Oracle,首先需要设置一系列环境变量,这些变量用于指定 Oracle 的安装目录、实例名等关键信息。具体操作如下: ```bash export ORACLE_BASE=/oracle export ORACLE_HOME=/oracle/...
在IT领域,Unix和Linux操作系统是企业级Oracle数据库服务器的常用平台。Oracle数据库管理系统是全球最广泛使用的数据库系统之一,尤其在大型企业和金融机构中。本文将深入探讨在Unix和Linux环境下如何有效地管理和...
### Linux 下 Oracle 手动建实例详解 #### 一、概述 在Linux环境中手动构建Oracle实例是一项高级且复杂的任务,通常适用于需要定制化配置或特殊需求的场景。本文档将根据给定的信息,详细介绍如何在Linux环境下手动...
### Linux 下 Oracle 参数设置详解 #### 一、引言 在 Oracle 数据库的部署过程中,合理的操作系统内核参数设置对于确保数据库性能至关重要。虽然 Oracle 官方提供了不同平台下的数据库安装指南,其中包含了一些系统...
### Linux VM 平台扩展 SGA 的关键技术与实践 #### 执行概览 随着技术进步,特别是商品化服务器领域的快速发展及 Oracle 数据库架构的优化,原本价格高昂且维护成本较高的大型机不再独占鳌头。Intel 基础架构...
这个合集包含了Windows 32位和Linux 32位两个平台的安装文件,适用于不同操作系统环境下的数据库部署。Oracle数据库在企业级应用中广泛使用,因其强大的性能、高可用性和安全性而备受赞誉。 1. 数据库概念:数据库...
### Linux环境下手动创建Oracle 10g数据库详细步骤与知识点解析 #### 一、环境配置与准备工作 在Linux系统中手动创建Oracle 10g数据库,不仅能够深入了解Oracle数据库的安装与配置流程,还能帮助更好地掌握数据库...
在 32 位 WINDOWS SERVER 2003 旗舰版、16G 内存、ORACLE10.1.0.2 环境下,将 ORACLE 的 SGA_MAX_SIZE 设置为 2G,但是在重启数据库时报错:ORA-27100 shared memory realm already exists。 解决方案: 1. 使用 ...
### Linux下启动Oracle数据库的方法详解 #### 一、前言 在Linux环境下部署与管理Oracle数据库是许多系统管理员和DBA的重要职责之一。本文将详细介绍如何在Linux操作系统中启动Oracle数据库,包括必要的环境配置...
### 在Linux系统下Oracle数据库的安装及设计方案 #### 摘要 本文主要探讨了如何在Linux操作系统下安装Oracle数据库,并对其系统结构和工作原理进行了深入解析。此外,还从六个不同的方面全面总结了Oracle数据库的...
### Linux下安装Oracle 11g详细步骤 #### 一、环境准备与系统检查 在开始安装Oracle 11g之前,确保您的Linux系统满足Oracle官方推荐的最低配置要求。 ##### 1. 检查硬件 - **内存**:Oracle 11g建议至少有1GB的...
"linux-oracle11-Resources"这个压缩包显然是为Linux系统准备的Oracle 11g安装资源,包括了32位和64位的依赖包。下面我们将详细探讨Oracle 11g在Linux上的安装过程及其相关知识点。 首先,Oracle数据库是企业级的...
在开始构建Oracle 11g数据库之前,确保已经在Red Hat Enterprise Linux 5.4.32环境下正确安装了Oracle软件。安装过程中应当设置`ORACLE_BASE`和`ORACLE_SID`两个重要的环境变量,这两个变量对于后续数据库的正常运行...
手工建库: 1.写参数文件,创建实例: vi $ORACLE_HOME/dbs/initorcl.ora 写入以下内容: ...control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/oradata/orcl/control02.ctl'
Oracle 10.2.0.5 是Oracle Database的一个重要版本,主要针对Windows操作系统提供了32位和64位的支持。这个版本发布于2007年,它在Oracle 10g R2的基础上增加了多项功能和性能改进,旨在提供更稳定、高效的数据管理...
在Linux上安装并运行Oracle是一项复杂但至关重要的任务,尤其对于那些依赖于Oracle数据库的企业级应用。Oracle数据库系统是全球广泛使用的高性能、高可靠性的数据库解决方案。本篇将深入探讨如何在Linux环境下安装和...
在Linux系统上部署Oracle 10G数据库是一个复杂而精细的过程,涉及到多个步骤和技术细节。以下将详细阐述这个过程。 首先,我们需要一个稳定的Linux环境。在这个案例中,我们使用的是Red Hat Linux Enterprise 4.0 ...
在Linux环境下安装Oracle 10g是一个相对复杂的过程,涉及到多个步骤和配置。本文将详细介绍这一过程,包括系统准备、安装、配置以及后续的优化。 一、系统准备 1. 确认硬件需求:Oracle 10g对内存、CPU和磁盘空间有...