리눅스에서는 여러가지 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

 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.