32位 oracle SGA 扩展原理

来源:互联网 发布:lua windows安装 编辑:程序博客网 时间:2024/05/16 14:45

32位 oracle由于位数限制,是的oracle进程只能访问4GB(2的32次方)以下的虚拟额内存地址,这样一来,很多情况下内存空着而不能使用。默认情况下SGA不能超过1.7GB,这时,我们就要考虑怎样扩展oracle的SGA。

1、识别32为的oracle

通过执行:SQL> select * from v$version;

如果是64位的oracle,在查询结果中一定会显示64bit字样。若没有出现,则一定是32bit oracle。 当然也可以在操作系统上,进入$ORACLE_HOME/bin 目录,执行 $ file oracle

命令,会直接显示。

在确认了32位的数据库之后,通常情况下os系统进程只能访问4GB以下的空间,在 redhat linux as2.1 或者 as 3.0 版本中,他们可以提供VLM(Very  Large  Memory )功能支持,使得通过转换可以使用36bit 来标志内存地址,那么就是2的36次方,理论上最大可支持64GB的内存访问。这在oracle中,则是通过将内存单做文件来访问的,虚拟一个/dev/shm 的文件系统,这个文件系统是完全由内存组成的,这样将突破4GB的限制。

2、为何SGA存在1.7GB的限制

既然进程可以访问4GB以下的内存,为何通常SGA又是1.7GB呢?

在操作系统中,规定了一个进程在应用程序中,能访问的虚拟内存空间为0--3GB,而3--4GB这段虚拟地址空间是保留给kernel使用的。要注意这里强调的是虚拟地址空间,并没有说是物理地址空间。也就是说,假设8GB的内存,这0--3GB的虚拟内存地址空间可能出现在8GB内存的3GB--8GB部分内存段,并不是说物理内存的0--3GB的虚拟地址中,而这0--3GB的虚拟地址中,oracle是的使用时固定好了地址的(是虚拟地址的固定,不是物理地址的固定哦)

0GB  —— oracle program 装载起点。

1GB  ——oracle共享库装载起点。

1.25GB  —— SGA起点。

2GB  ——program stack

3GB  ——kernel

在这段虚拟地址分配中,1.25GB是SGA的起点,而进程的私有空间的分配(stack部分)却是从靠近3GB处开始的。也就是实际上SGA和进程私有空间都是共用了1.25GB--3GB这部分的,由于进程私有空间特别小,通常习惯性的认为SGA可以达到1.7GB。进程私有空间有0.05GB足够了。

从oracle启动开始,或者从任何一用户进程登陆开始,所有的虚拟内存都已经分配固定好了,只有私有用户空间还可以扩展。

原创粉丝点击