Oracle内存分配与调整(下)
但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过1.7G的内存,达到2G以上甚至更多。在这里我们针对不同的平台下的具体实现方式做一个总结。
一.在REDHAT ADVANCED SERVER2.1上扩展SGA(1.7G以上)
能够在一个4G以上内存的机器上将SGA从1.7G的最大限制增大至2.7G,兼容Oracle8.1.7、9.0.1、9.2.0版本的数据库,但是只是允许在本地启动和关闭数据库,而且如果为PGA保留的虚拟内存太小就会导致ORA-4030的错误。
具体步骤如下:
1.查看启动Oracle用户的shell的进程号PID
ps –f或者echo $$
2.以root用户单独打开一个进程,执行
echo 268435456 > /proc/$PID/mapped_base
注:Lowing the mapped_base要对服务器上所有产生Oracle的进程的shell。可以写一个脚本在.profile或者.login文件中使其每次都不必手工去做。
一个脚本的例子,使用setuid()设置/proc//mapped_base:
int main(int argc,char * argr[ ])
{
pid_t,ppid;
char buf[256];
unsigned long mapped_base;
int ret;
#define NEW_MAPPED_BASE 0X10000000
ppid=getppid();
mapped_base=NEW_MAPPED_BASE;
sprintf(buf,”echo %/u >/proc/%u/mapped_base”,mapped_base,ppid);
setuid(0);
ret=system(buf);
if (ret==0)
printf(“Lowering mapped_base of pid=%u to 0x%X \n”,ppid,mapped_base);
else
printf(“unable to lower mapped_base.You might need to:\n”
“chmod 4711 lowermap \n chown
root root lowermap \n”);
exit (-ret);
3.修改shmmax的值,以root用户执行:
echo 3000000000 > /proc/sys/shmmax
4.重新分配SGA
关闭所有Oracle实例
cd $ORACLE_HOME/lib
cp –a liberver9.a libserver9.a.org (对要修改的libserver9.a文件做个备份)
cd $ORACLE_HOME/bin
cp –a oracle oracle.org
cd $ORACLE_HOME/rdbms/lib
genksms –s 0x15000000 > ksms.s
make –fins_rdbms.mk ksms.o (编译新的SGA地址)
make –fins_rdbms.mk ioracle(重新链接)
这样修改之后就可以支持到2.7G左右的SGA,从而可以提高db_cache_size或者db_block_size去提高数据库的缓冲区了。
5.如果你已经有了一个较大的buffer cache,并且在init文件中设置了use_indirect_data_buffers=true,可以用以下的方法去提高indirect buffer window
size。对于大多数的应用来说默认的512M已经足够,增大window size可以略微的提高性能,因为大的window size可以减少mapping一个indirect buffer到oracle的地址空间的负载。
设置环境变量VLM_WINDOW_SIZE在启动实例之前,这个值比如是64K的整数倍。例如:
export VLM_WINDOW_SIZE=1073741824(1G)
注:这么设置的前提是buffer cache不能太大,SGA区不能小于800M。如果在启动实例的时候报错,则有可能是需要清除共享内存段
ipcrm shm xxx或者ipcrm sem xxx
二.HP TRUE64 UNIX上扩展SGA大于2G
1.检查是否有足够的内存分配给SGA
userf –r 300
|grep –i mem
2.配置核心参数文件/etc/sysconfigtab文件
vm:
vm-maxvas=实际物理内存
vm-mapentires=400
ubc-minpercent=1
ubc-maxpercent=2
ipc:
shm-max=实际物理内存或者大于SGA
shm-mni=128
shm-seg=32