본문 바로가기
엑셈 기업문화/엑셈 사람들

[이홍원]IPCS 이야기

by EXEM 2009. 1. 16.


ipcs 이야기를 해 보련다.
왜? 이게 뭣에 쓰는 물건인고 하면서도 알맹이만 쏙쏙 뽑아먹고 있는 자신의 모습이 우스꽝스러워 좀 알고 쓰자란 생각이 들었기 때문.

whreis ? 누구냐 넌

RH3@PROD : /home/oracle>$whereis ipcs
ipcs: /usr/bin/ipcs /usr/share/man/man8/ipcs.8.gz

오라클 명령어는 오라클 디렉토리에 있는걸 생각했을 때 오라클과는 무관한 명령어같다.
( 글  후반부에 이르러 오라클과 관계없다는 것을 확신한 자신이었다… )
디렉토리 보니 오라클은 아닌 것 같고 성급히 개안의 경지에 이르려다 man 으로 확인 해 보았다

RH3@PROD : /home/oracle>$man ipcs  ( manual 의 man 이다 )

IPCS(8)                    Linux Programmer's Manual                   IPCS(8)

NAME
       ipcs - provide information on ipc facilities

ipc 설정에 대한 정보를 제공한댄다. 짧고 간결하다. 여기서 나는 ipc를 모른다는 깨달음을 얻었다.

ipc 넌 또 누구냐?

Inter-Process Communication (IPC) is a set of techniques for the exchange of data among multiple threads in one or more processes. ( from WIKIPEDIA )

하나 혹은 그 이상의 프로세스안의 다중 스레드간 데이터교환 기술의 집합이라고 되어있다. 사전적 의미로는 이해가 되나 와닿지는 않는다.

WIKIPEDIA 설명 하단부에 IPC의 분류표가 있었다.
FILE, SIGNAL, SOCKET, PIPE, … , Semaphore, SHARED MEMORY, …, Message Queue, …
목록을 보니 그제서야 ipcs 명령어와의 연관성이 약간이나마 보였다.
SHARED MEMORY 항목을 본 기억이 있다.

RH3@PROD : /home/oracle>$ipcs

------ Shared Memory Segments --------
key           shmid      owner      perms      bytes      nattch     status     
0x00000000 32768      oracle        600        393216        2          dest        
0x00000000 65537      oracle        600        393216        2          dest        
0x00000000 98306      oracle        600        393216        2          dest        
0x00000000 131075     oracle       600        393216        2          dest        
0x00000000 163844     oracle       600        393216        2          dest        
0x00000000 196613     oracle       600        393216        2          dest        
0x00000000 360454     oracle       600        393216        2          dest        
0x00000000 262151     oracle       600        393216        2          dest        
0x00000000 294920     oracle       600        393216        2          dest        
0x94a59fa0 327689     oracle       640        272629760   32                     

------ Semaphore Arrays --------
key        semid      owner      perms      nsems    
0xd8f92a88 98304      oracle    640        34       

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

ipcs 는 ipc에 대한 현재 상태를 보여준다.
특히 Shared Memory Segments는 Oracle의 SGA 영역과 깊은 관계를 가진다.
DB를 SHUTDOWN 시킨 후 ipcs 명령을 다시 실행해 보았다.

RH3@PROD : /home/oracle>$ipcs -m

------ Shared Memory Segments --------
key             shmid    owner      perms      bytes      nattch     status     
0x00000000 32768      oracle        600        393216        2          dest        
0x00000000 65537      oracle        600        393216        2          dest        
0x00000000 98306      oracle        600        393216        2          dest        
0x00000000 131075     oracle       600        393216        2          dest        
0x00000000 163844     oracle       600        393216        2          dest        
0x00000000 196613     oracle       600        393216        2          dest        
0x00000000 360454     oracle       600        393216        2          dest        
0x00000000 262151     oracle       600        393216        2          dest        
0x00000000 294920     oracle       600        393216        2          dest

맨 아랫 줄에 위치했던 값이 사라졌다. 이 사라진 값은 어디서 왔고 차지하고 있던 272629760 ( 260 Mb ) 란 값은 어디서 온것일까?

전자에 대해선 물어볼 필요가 없는 질문이다. 아까와 지금 다른 점은 ORACLE의 상태뿐이다. 파라미터를 확인하기 위해 startup nomount 를 하고 ipcs 명령어를 다시 사용해 보았다.

--- 중략 ---
0x00000000 262151     oracle    600        393216       2          dest        
0x00000000 294920     oracle    600        393216       2          dest        
0x94a59fa0 393225     oracle    640        272629760   37


DB STARTUP NOMOUNT 이후 IPCS 명령어로 확인한 결과 아까 그값은 동일한 키값과 사이즈를 가졌다. MAXGAUGE를 설치할 때 IPC 값으로 저 KEY 값을 입력한다. DMA를 위해서는 무언가 변하지 않는 이정표가 필요할 것이다. 이 KEY 값이 무얼 의미하는지는 아직 모르지만 변하지 않는 값이기에 사용할 것이다.

추가로 260Mb 가 어디서 온 값인지 확인해보겠다. Oracle의 메모리 스트럭쳐는 SGA 라 하며 처음 S 이니셜에 해당하는 단어로 SYSTEM 과 SHARED 두가지를 지칭한다. Shared Global Area 라 해석하였을 때 공유하기 위한 전역공간이라 해석 할 수 있고 때문에 SHARED MEMORY SEGMENTS 에 위치한 것이다.

이어 bytes 값을 SGA를 이루는 주요파라미터를 조회해 확인해 보았다.
( 가독성을 위해 적당히 편집하였다. )

NAME                                                    TYPE                    VALUE
------------------------------------ ----------- ------------------------------
db_cache_size                                   big integer                16777216
log_buffer                                           integer                      524288
sga_max_size                                    big integer                 252777592

value를 합산한 결과 270079096 ( 약 257.6 메가 ) 로 거의 일치하는 것을 확인하였다.

위의 값들이 SGA의 값이라는 건 확인하였고 이는 SHARED MEMORY SEGMENTS에 위치한다.
그렇다면 SHARED MEMORY는 어떠한 메모리일까?
a method of inter-process communication (IPC), i.e. a way of exchanging data between programs running at the same time. One process will create an area in RAM which other processes can access, or ( from WIKIPEDIA)

IPC의 한 분류로 동시에 실행되고 있는 프로그램 간의 데이터 교환 방법, 어느 한 프로세스가 다른 프로세스들이 접근 가능한 공간을 램상에 만들어낸 공간이라고 한다.

ORACLE은 SGA라는 영역을 공유해서 사용하기 위해 IPC의 SHARED MEMORY SEGMENTS 를 사용하고 있는 것이다.

간단히 ipcs 명령을 실행하였을 때 나오는 정보에 대해 이야기 해보려 한다. ipcs 명령어를 실행했을 때 값을 보면 nattch 값이 있다. 이는 해당 영역에 붙어있는 프로세스 숫자를 의미한다. 오라클과 세션을 맺으면 숫자가 증가하는 걸 확인할 수 있다. 증가하는 수의 의미에 대해선 아직 답을 찾지 못했다.
 key 값은 공유메모리를 구분하기 위해 사용하고 shmid 는 shared memory id 라 하여 pid 처럼 고유하다고 한다. 고유하다는 것은 독자적인 값을 갖는다는 것이고 재할당시 값이 달라진다.

key 값은 달라지는 경우가 거의 없다고 한다. 바뀌는 경우에 대해서는 더 찾아보고 공부해야 할 필요가 있다.

처음으로 블로그에 올리는 글인 만큼 무언가 제대로 마무리 하고 싶은 마음이 있었지만 마무리가 약했다는 느낌이다. 질문에 대해 해답을 구하려 했으나 도리어 그 과정중에 또다른 질문이 생겨났다. 시간은 유한하기에 글은 여기서 매듭을 짓지만 운좋게도 또다른 주제가 주어졌다. 꼬리에 꼬리를 무는 이러한 과정이 있기에 끊임없이 탐구하고 즐길 수 있는게 아닐까 생각한다.


<<참조 >>
ipcs
http://www.perlmania.or.kr/pmdocs/ldh/using_shared_memory.html
IPC
http://en.wikipedia.org/wiki/Inter-process_communication
공유메모리 사용의 개요http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/IPC/SharedMemory?action=print
공유메모리
http://www.perlmania.or.kr/pmdocs/ldh/using_shared_memory.html

댓글