본문 바로가기

카테고리 없음

ORACLE 11g Shared Memory and /dev/shm v1.0

ORACLE 11g Shared Memory and /dev/shm v1.0

 

Date

Ver

Etc.

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/