ORACLE 11g Shared Memory and /dev/shm v1.0
11.07.11 |
|
|
|
|
|
|
|
|
1.
/dev/shm
Linux Install 시 이 값은 default 로 Physical Ram 의 1/2 Size 로 mount 된다.
일례로 4G
Physical Ram 을 가지고 설치한 경우 다음과 같다.
dg2@/home/oracle>df
-h Filesystem Size Used Avail Use% Mounted on /dev/sda1 26G
16G 8.6G 65% / tmpfs 2.0G 0
2.0G 0% /dev/shm dg2@/home/oracle>mount /dev/sda1 on /
type ext3 (rw) proc on /proc
type proc (rw) sysfs on /sys
type sysfs (rw) devpts on
/dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) none on
/proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on
/var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) none on
/proc/fs/vmblock/mountPoint type vmblock (rw) |
mount 되었다는
것은 파일시스템의 일종으로 본다는 것이며 본래 memory 인 만큼 임시성 파일시스템이다. 임시성이라는 것은 데이터가 휘발성을 가진다는 의미로 사용하였다.
2.
ORACLE Shared Memory
ORACLE 에서 Shared Memory 는 프로세스간 데이터를 공유하기 위한 영역으로
SGA, PGA 등이 위치한다.
그리고 이름 그대로 ORACLE 의 Shared Memory 는 OS 의 Shared Memory 를 사용한다. 11g 부터는 memory_target 을 통해 위 값을 전부 자동관리하며 이 파라미터는
memory_max_target 을 초과할 수 없다.
추가로 memory_max_target 은 mount 되어 있는 tmpfs 영역을 초과할 수 없다. 다시말해 4g Linux 시스템을
default 로 설치하면 2g 의 tmpfs 가 mount 될 것이고 이로인해 memory_max_target 은 2g 이상을 잡을 수 없다.
3.
memory_max_target 의 변경
ORACLE 이 Startup 되어 있는 상황에서 memory size 와 관계된 파라미터를 확인하였다.
SQL> show parameter memory NAME TYPE VALUE ------------------------------------ -----------
------------------------------ hi_shared_memory_address integer 0 memory_max_target big integer 1584M memory_target big integer 1584M shared_memory_address integer 0 |
현재
memory_max_target, memory_target 모두 1584M 임을 확인하였다. System level 로 바로 변경이 가능한지 확인해 보았다.
NAME ISSYS_MODIFIABLE ------------------------------
------------------------------ memory_target IMMEDIATE memory_max_target FALSE |
memory_target 이 immediate 이다.
바로 변경이 가능하다는 것을 의미하나 memory_max_target 을 초과할 수 없다. 1584M 을 3036M 으로 변경하기 위해서는 memory_max_target 을 변경해야 하며 이는 DB Restart 가
필요하다.
memory_max_target 값을 3036M 으로 변경하여 Restart 해 보았다.
SQL> alter system set memory_max_target=3036m
scope=both; alter system set memory_max_target=3036m scope=both
* ERROR at line 1: ORA-02095: specified initialization parameter cannot
be modified SQL> alter system set memory_max_target=3036m scope=spfile; System altered. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORA-00845: MEMORY_TARGET not supported on this system |
memory_max_target 이 system level 로 immediate 하게 변경이 불가능함을 확인하였고, scope=spfile 로
변경하였다. DB 를 Shutdown 했다가 다시 Startup 을 시도하자 ORA-00845 라는 에러가 발생하였다.
SQL> !oerr ora 845 00845, 00000, "MEMORY_TARGET not supported on
this system" // *Cause: The MEMORY_TARGET parameter was not
supported on this operating system or /dev/shm was not sized correctly on
Linux. // *Action: Refer to documentation for a list of
supported operating systems. Or, size /dev/shm to be at least the
SGA_MAX_SIZE on each Oracle instance running on the system. |
에러를 확인하자 /dev/shm
의 사이즈에 대해 언급하고 있다.
현재 시스템의
/dev/shm 사용량은 1번에서 이미보았기 때문에 생략하고 변경하기 위한 과정을 보겠다.
[root@dg1 ~]# vi /etc/fstab LABEL=/ / ext3 defaults 1 1 devpts /dev/pts devpts
gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 LABEL=SWAP-sda2 swap swap defaults 0 0 # Beginning of the block added by the VMware software .host:/ /mnt/hgfs vmhgfs defaults,ttl=5 0 0 # End of the block added by the VMware software LABEL=/ / ext3 defaults 1 1 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults,size=4g 0 0 proc
/proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 LABEL=SWAP-sda2 swap swap defaults 0 0 # Beginning of the block added by the VMware software .host:/ /mnt/hgfs vmhgfs defaults,ttl=5 0 0 # End of the block added by the VMware software [root@dg1 ~]# mount -o remount /dev/shm [root@dg1 ~]# mount /dev/sda1 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm
type tmpfs (rw,size=4g) none on /proc/sys/fs/binfmt_misc type binfmt_misc
(rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs
(rw) none on /proc/fs/vmblock/mountPoint type vmblock (rw) [root@dg1 ~]# df -h Filesystem
Size Used Avail Use% Mounted on /dev/sda1
26G 17G 7.9G
68% / tmpfs 4.0G 0
4.0G 0% /dev/shm |
/etc/fstab 을 open 하여 tmpfs
부분을 확인하였고 defaults 항목 옆에 size 를 4g 로 명시하였다.
수정한 후 mount –o
remout 명령을 통해 변경사항을 바로 적용하였고, df 명령을 통해 바로 확인할 수
있었다.
변경된 상황에서 DB 를
다시 startup 해 보았다.
SQL> startup ORACLE instance started. Total System Global Area 3173429248 bytes Fixed Size 2217544 bytes Variable Size 2650802616 bytes Database Buffers 503316480 bytes Redo Buffers 17092608 bytes Database mounted. Database opened. SQL> show parameter memory NAME TYPE VALUE ------------------------------------ -----------
------------------------------ hi_shared_memory_address integer 0 memory_max_target big integer 3040M memory_target big integer 1584M shared_memory_address integer 0 |
이상없이 startup
되었다.
4.
Question
ORACLE 이 Shared Memory 를 사용중에 shared memory size 를 변경하면 어떤일이 일어날까?
[root@dg1 ~]# df -h Filesystem
Size Used Avail Use% Mounted on /dev/sda1
26G 17G 7.9G
68% / tmpfs
2.0G 923M 1.1G
46% /dev/shm </etc/fstab 의 tmpfs 의 size 를 512M
로 변경> [root@dg1 ~]#
mount -o remount /dev/shm mount: /dev/shm
not mounted already, or bad option [root@dg1 ~]# df -h Filesystem
Size Used Avail Use% Mounted on /dev/sda1
26G 17G 7.9G
68% / tmpfs
2.0G 923M 1.1G
46% /dev/shm [root@dg1 ~]# ps -ef | grep pmon oracle
3460 1 0 14:44 ? 00:00:00 ora_pmon_DG1 root
3878 3763 0 14:50 pts/0 00:00:00 grep pmon </etc/fstab 의 tmpfs 의 size 를 1기가로
변경> [root@dg1 ~]# ps -ef | grep pmon oracle
3460 1 0 14:44 ? 00:00:00 ora_pmon_DG1 root
3914 3763 0 14:51 pts/0 00:00:00 grep pmon [root@dg1 ~]# df -h Filesystem
Size Used Avail Use% Mounted on /dev/sda1
26G 17G 7.9G
68% / tmpfs
1.0G 923M 102M
91% /dev/shm |
위 결과를 통해 알 수 있는 것은 다음과 같다.
-
memory_target
을 3G 잡는다고 해서 처음부터 3G 를 잡는 것이 아니다.
-
/dev/shm
은 실제 사용량 만큼 줄일 수 있다. 다른
프로세스가 사용중인 크기보다 작게는 조정되지 않는다.
Alert log 를 확인한 결과 별 다른 특이사항 없었다. 다만 현재 사용량이 mamory_target 보다 작기 때문에 사용량이 증가했을 때 문제가 생길것이다. (여기서는 확인하지 않았다.)
5.
References
A.
How To Resize /dev/shm
Filesystem In Linux?
http://www.walkernews.net/2010/05/04/how-to-resize-devshm-filesystem-in-linux/