메시지 큐에 관련한 질문입니다.(Queue full??)
글쓴이: bejoy4him / 작성시간: 수, 2004/09/15 - 8:53오전
메시지 큐를 이용한 멀티 쓰레드 프로그램을 작성하고 있습니다. 큐에서 recv하는 쓰레드가 잘못되었는지 한동안 잘 돌다가 블럭이 걸립니다. 그래서 혹시나 하는 마음에 recv하는 프로그램을 만들어서 돌리니 메시지 큐에 걸렸던 블럭이 해제되었습니다.
뭐... 증상을 보아하니 Queue Full인것 같기는한데.... ipcs -qa 명령을 사용해서 큐상태를 보면 Queue Full이 아닌것 처럼 보입니다.
Quote:
cpteam :~/call_proc/cp_pkg/lnk_out/pjw>ipcs -qa
IPC status from <running system> as of 2004년 9월 14일 화요일 오전 08시 27분 37초
T ID KEY MODE OWNER GROUP CREATOR CGROUP CBYTES QNUM QBYTES LSPID
LRPID STIME RTIME CTIME
Message Queues:
q 212670 0x2712 -Rrw-rw-rw- cpteam other cpteam other 0 0 40960000
0 0 no-entry no-entry 12:22:50
q 212161 0x3a9a -Rrw-rw-rw- cpteam other cpteam other 0 0 40960000 2737
7 27377 20:01:58 20:01:58 12:22:50
q 212162 0x4e22 --rw-rw-rw- cpteam other cpteam other 310264 10823 40960000 2737
7 27377 20:01:58 12:24:12 12:22:50
q 212163 0x61aa -Rrw-rw-rw- cpteam other cpteam other 0 0 40960000 2737
제 짧은 지식으로는 아직 큐에 공간이 남아있는듯 한데...
큐에 들어갈수 있는것은 전체 바이트 수 뿐만이 아니라 count에도 제한이 있는것인지 궁금합니다.
Forums:
메시지큐 제한 있습니다.
일단 님께서 작성하신 플에서 wait가 걸리는 이유는
msgsnd()에서 Lock이 걸려있어서 입니다.
Lock이 걸리는 이유는 당연히 msgrcv()를 하지 안했기 때문이겠죠.
또한 msgrcv()를 하지 못한 이유는 여러가지가 있겠지요.
msgsnd()에서 Lock를 피하기 위하여
IPC_NOWAIT 옵션을 사용하기도 하지만
그에 따라서 체크해야 할 상황이 많이도 발생할테구요.
님께서 궁금하신 메시지 FULL문제는 다음과 같습니다.
/proc/sys/kernel 에 보면 다음의 특수파일이 있습니다.
기본으로 msgmni 는 16이 지정되어 있습니다.
msgrcv()가 한순간이라도 정상작동하지 않는다면
16이라는 메시지 큐 수는 모두 차버릴 것입니다.
이상 허접 대답입니다.
답변 감사합니다.
답변 감사합니다.
일단 제가 보기에도 recv쪽에서 제대로 동작하지 못하여 블럭이 걸린것으로 보입니다.
문제는 왜 Full이 아닌것 같은데.. 블럭이 걸리는가 하는것이죠....
제대로 읽어가지 못해도 큐가 full이 되기전까진 send가 제대로 수행될듯 보이는데...
그리고 KLDP에다가 솔라리스에 관련된 질문을 하는것 자체가 맞지 않지만...
일단 서버가 솔라리스라서 도움주신 파일들은 찾아볼수가 없네요....
메시지 큐에는 여러가지 제한 사항이 있습니다.한 메시지의 최대 크
메시지 큐에는 여러가지 제한 사항이 있습니다.
한 메시지의 최대 크기, 메시지 큐에 들어갈 수 있는 최대 메시지 개수,
현재 메시지큐(시스템에 존재하는 모든 메시지큐)에 존재하는 총 메시지 수,
총 메시지 바이트수등의 제한이 있습니다.
그래서 ipcs -qob를 이용하여 다른 메시지 큐에 쌓여 있는 메시지가 있는지 확인해보시기 바랍니다.
아마도 sun에는 sysdef라는 명령어가 있었던거 같은데 확인해보시기 바랍니다.
Solaris에서는 /etc/system 파일에 설정을 할수 있습니다.
Solaris에서는 /etc/system 파일에 설정을 할수 있습니다.
이런식으로요..
저같은 경우는 Message Queues를 무진장 쓰거든요.
이것들 setting한거 다 보이시죠.. ^^;
>/dev/null 2>&1
모두들 정말 감사합니다.
모두들 정말 감사합니다.
메시지 큐에 조정에 대해서 모르는 부분이 많았었는데 이번 기회에 여러가지 알게된것 같습니다.
우선 문제가 되었던 부분은 큐에 메시지 갯수가 너무 많이 쌓여서 그렇게 된것이었습니다.
msgtql이 20000으로 설정되어있었는데... 큐에 쌓여있는 메시지를 전부 더해보니 19999개나 되었습니다. 메시지 카운트때문에 블럭이 걸린것이었죠..
혹시 모를 다른 분을 위해 다음 글을 인용합니다.
댓글 달기