ipcs 이야기를 해 보련다.
왜? 이게 뭣에 쓰는 물건인고 하면서도 알맹이만 쏙쏙 뽑아먹고 있는 자신의 모습이 우스꽝스러워 좀 알고 쓰자란 생각이 들었기 때문.
whreis ? 누구냐 넌
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
'엑셈 기업문화 > 엑셈 사람들' 카테고리의 다른 글
[황종필]기본으로부터의 발상의 전환 (5) | 2009.03.10 |
---|---|
[이창원]넓은 시야에 대한 성찰 (4) | 2009.02.13 |
[신형규]달면 삼키고 쓰면 뱉는다. (0) | 2009.01.09 |
[이누리]아직은 어려운 TStringList (1) | 2008.12.19 |
[한승민]Top down 방식이 아닌 Thread 단위의 트랜잭션 개별 분석 방법 (1) | 2008.12.09 |
댓글