티스토리 뷰

개발/Linux

message queue 최대 길이

Jaeyeon Baek 2017.04.25 12:17

이러저러한 이유로 Linuxmessage queue를 사용하고 있는데, 메시지의 길이가 일정 수치를 넘어가면 문제가 발생했다. sysctl로 확인하고 값을 변경해도 동일.


$ sysctl kernel.msg{max,mni,mnb}
kernel.msgmax = 65535
kernel.msgmni = 16
kernel.msgmnb = 65535
$


각 고유한 값을 변경하는 방법은 아래와 같다.

$ sysctl -w kernel.msgmax=655350

kernel.msgmax = 655350


보이기에는 잘 변경 된 것처럼 보이지만 실제로 긴 문자열은 처리가 안되더라. 하아. 오랜만에 커널 코드를 열어보자. 서버에서 사용하는 커널 버전은 아래 링크를 통해 구했다.

https://www.kernel.org/pub/linux/kernel/v2.6/


ipc를 처리하는 ipc/msg.c 에서 우선 메시지 큐가 생성되는 함수를 뒤져보았다. 시스템 콜을 통해 처리될테니 sys_msgctl 이 되겠지. 여기서는 애플리케이션에서 큐를 생성할 때 지정한 큐의 사이즈를 리사이징하는 구문이 포함되어 있다(!)


if (in->msg_qbytes > USHRT_MAX)
    out.msg_qbytes = USHRT_MAX
else 
    out.msg_qbytes = in->msg_qbytes;

예상할 수 있듯이 USHRT_MAX의 크기는 0xFFFF 이다. 고로 큐를 생성할 때 최대 사이즈는 이미 0xFFFF까지 밖에 사용할 수 없는 상태이니 msgsnd 로 더 큰 메시지를 한번에 전송하려고 하면 오류가 발생하는 것은 지극히 정상적인 상황이겠다.


단, 여기서 주의할 것은 IPC 사용 버전에 따라 차이가 있을 수 있다는 점이다. 이건 여기서 다룰 문제는 아니니까 스킵하도록 하자. (여기서 다룬 코드 내용은 최신 4버전의 커널도 크게 차이가 없다는 것을 알아두자.)


댓글
댓글쓰기 폼