리눅스에서는 여러가지 IPC(Interprocess Communication) 을 지원한다.
그 중, 메시지 큐의 경우 기본으로 잡혀있는 Open 가능한 최대 갯수는 16개로 지정되어 있는데, 간혹 여러 개의 메시지 큐를 사용하는 프로그램을 사용한다거나 등의 이유로 많은 갯수의 Message Queue가 필요한 경우 에러가 발생한다.
오늘 있었던 일도 그 중 하나였는데, 계속 해서 프로그램 구동시, Message Queue의 생성이 실패하며 자꾸 프로그램이 죽는 현상이 발생했다. 한참을 고민하다가 선임의 도움으로 해결할 수 있었다.
문제의 파악은 icps -q 명령어로 시작한다.
현재 운용 중인 많은 수의 메시지 큐. 이것이 문제였다.
[cube@cube1 RUN]$ ipcs -q
—— Message Queues ——–
key msqid owner perms used-bytes messages
0x00015d40 0 cube 666 0 0
0x00015d41 32769 cube 666 0 0
0x00018388 1441794 cube 666 0 0
0x00018389 1474563 cube 666 0 0
0x000182bb 5079044 cube 666 0 0
0x000182eb 5111813 cube 666 0 0
0x000182ec 5144582 cube 666 0 0
0x000182b9 5177351 cube 666 0 0
0x000182ba 5210120 cube 666 0 0
0x000182bc 5242889 cube 666 0 0
0x0000ea60 5505034 cube 666 0 0
곧바로 확인 해 본 생성가능한 메시지 큐 갯수. 16개다. 당연히 문제가 생길 수 밖에.
[cube@cube1 RUN]$ ipcs -lq
—— Messages: Limits ——–
max queues system wide = 16
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
구글링을 해보니 커널소스의 msg.h 헤더 파일에서
#define MSGMNI 16 /* <= IPCMNI */ /* max # of msg queue
부분을 원하는 양으로 수정한 후, 다시 커널 컴파일을 수행하면 된다고 한다. 하지만 저 부분 하나만을 위해 커널 컴파일을 하기에는 너무 비효율적이다. 다행히 다른 방법이 있었다.
sysctl 명령어를 통한 수정 방법도 있었다. 재부팅이 되면 이 설정은 다시 초기화가 되지만 방법과(rc.local 파일에 설정한다거나..) 때에(잠시만 사용할 경우) 따라서는 요긴한 방법이다.
root 계정으로 로그인한 후, sysctl 명령어를 통해 메시지 큐의 갯수를 늘리는 방법은 아래와 같다.
sysctl -w kernel.msgmni=32
다음은 위의 명령어 이후에 확인한 메시지 큐의 내용들이다.
[cube@cube1 RUN]$ ipcs -q
—— Message Queues ——–
key msqid owner perms used-bytes messages
0x00015d40 0 cube 666 1 1
0x00015d41 32769 cube 666 0 0
0x00018388 1441794 cube 666 0 0
0x00018389 1474563 cube 666 0 0
0x000182bb 5079044 cube 666 0 0
0x000182eb 5111813 cube 666 0 0
0x000182ec 5144582 cube 666 0 0
0x000182b9 5177351 cube 666 0 0
0x000182ba 5210120 cube 666 0 0
0x000182bc 5242889 cube 666 0 0
0x0000ea60 5505034 cube 666 0 0
0x0000ea61 5537803 cube 666 0 0
0x0000ea62 5570572 cube 666 0 0
0x0000ea63 5603341 cube 666 0 0
0x0000ea64 5636110 cube 666 0 0
0x0000ea65 5668879 cube 666 0 0
0x0000ea66 5701648 cube 666 0 0
[cube@cube1 RUN]$ ipcs -lq
—— Messages: Limits ——–
max queues system wide = 32
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384