在使用11G的AMM进行内存管理的时候,memory_target的值受到两个值的影响,一个是实际的服务器的物理内存,不能大于服务器的实际物理内存,这个使用free -m就可以很清楚可看到物理内存有多大,还有一个不怎么注意到的是/dev/shm,这个可以使用df -h看到。
[root@ASMTEST ~]# free -m
total used free shared buffers cached
Mem: 4252 2404 1848 0 190 1180
-/+ buffers/cache: 1033 3219
Swap: 2015 0 2015
[root@ASMTEST ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_asmtest-lv_root
28G 18G 8.1G 69% /
tmpfs 2.0G 350M 1.7G 18% /dev/shm
/dev/sda1 485M 55M 405M 12% /boot
如果要给memory_target分配内存,必须<1848M(free -m的free值)<2.0G(df -h的size值)。如果一不小心设置的值过大会出现ORA-00845: MEMORY_TARGET not supported on this system,实例起不来。
tmpfs默认的大小是RM的一半,假如你的物理内存是1024M,那么tmpfs默认的大小就是512M
一般情况下,是配置的小于物理内存大小的。
tmpfs配置的大小并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是不会被系统回收重新划分的
tmpfs的用途
例如:
Oracle 中的Automatic Memory Management特性就使用了/dev/shm。
LINUX中可以把一些程序的临时文件放置在tmpfs中,利用tmpfs比硬盘速度快的特点提升系统性能。
下面如何解决ORA-00845: MEMORY_TARGET not supported on this system
(1)版本是11.2.0.4,启用了自动内存管理AMM,因为memory_target和memeory_max_target都不为0.
(2)下面是循序渐进不断扩大memory_target的值,直到超过Size值。
[root@ASMTEST ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_asmtest-lv_root
28G 18G 8.2G 69% /
tmpfs 1000M 289M 712M 29% /dev/shm
/dev/sda1 485M 55M 405M 12% /boot
SQL> alter system set memory_max_target=713m scope=spfile;
System altered.
SQL> alter system set memory_target=713m scope=spfile;
System altered.
SQL> startup force;
ORACLE instance started.
Total System Global Area 747417600 bytes
Fixed Size 2256992 bytes
Variable Size 499126176 bytes
Database Buffers 243269632 bytes
Redo Buffers 2764800 bytes
Database mounted.
Database opened.
[root@ASMTEST ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_asmtest-lv_root
28G 18G 8.2G 69% /
tmpfs 1000M 193M 808M 20% /dev/shm
/dev/sda1 485M 55M 405M 12% /boot
(3)
SQL> alter system set memory_max_target=810m scope=spfile;
System altered.
SQL> alter system set memory_target=810m scope=spfile;
System altered.
SQL> startup force;
ORACLE instance started.
Total System Global Area 847630336 bytes
Fixed Size 2257960 bytes
Variable Size 549456856 bytes
Database Buffers 293601280 bytes
Redo Buffers 2314240 bytes
Database mounted.
Database opened.
[root@ASMTEST ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_asmtest-lv_root
28G 18G 8.2G 69% /
tmpfs 1000M 175M 826M 18% /dev/shm
/dev/sda1 485M 55M 405M 12% /boot
(4)
SQL> alter system set memory_max_target=1100m scope=spfile;
System altered.
SQL> alter system set memory_target=1100m scope=spfile;
System altered.
SQL> startup force;
ORA-00845: MEMORY_TARGET not supported on this system
[root@ASMTEST ~]# free -m
total used free shared buffers cached
Mem: 4252 1613 2639 0 179 884
-/+ buffers/cache: 549 3703
Swap: 2015 0 2015
这里可以看到实际可以使用的内存还有2639M,但是实例报错 MEMORY_TARGET not supported on this system,因为MEMORY_TARGET>(df -h tmpfs的Size值)
[root@ASMTEST ~]#vi /etc/fstab
修改后执行mount -o remount /dev/shm 后生效
[root@ASMTEST ~]# cat /etc/fstab | grep tmpfs --这里调整Size为2000M
tmpfs /dev/shm tmpfs defaults,size=2000m 0 0
[root@ASMTEST ~]# df -h --可以看到调整为2G,比 memory_target 1100m的值要大
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_asmtest-lv_root
28G 18G 8.1G 69% /
tmpfs 2.0G 83M 1.9G 5% /dev/shm
/dev/sda1 485M 55M 405M 12% /boot
SQL> startup force; --修改过后重启实例,可以正常启动
ORACLE instance started.
Total System Global Area 1152450560 bytes
Fixed Size 2252584 bytes
Variable Size 738197720 bytes
Database Buffers 402653184 bytes
Redo Buffers 9347072 bytes
Database mounted.
Database opened.
最后需要注意的是,如果有多个实例,那么其大小要大于所有实例所需要的内存总和,tmpfs 参数通常被称为操作系统依赖参数