솔라리스 공유 메모리 shmat 에서 Not enought space 에러에 대해 질문
안녕하세요~
다름이 아니라 솔라리스 10 에서 공유메모리 사용에 있어서
궁금한 점이 생겨 이렇게 문의 드립니다.
관련내용에 대하여 여기 저기 많이 자료를 찾아 봤는데요,
딱히 원하는 답이 없네요.
솔라리스 10 에서 중계서버 역할을 하는 것을 개발중인데요.
중간에 전문들의 유효성 여부를 shared-memory 에 정상/비정상/통신에러 .. 같은 항목을 두고
전문들의 유효성을 +1 해가며 사용중입니다.
문제는, 지금 스트레스 테스트 중인데요. 만여건 이상의 동시 전문을 받아서 처리하면서
shmat 된 구조체 변수 안에 값을 +1 씩 증가시키면서 사용하고 있습니다.
그런데 만여건 이상을 읽고 쓰고 하면서 어느순간 shmat 에서 "Not enough space" 하면서
shmat 가 실패하고 마네요.
혹시 이런현상에 대하여 알고 계신다면, 조언좀 부탁드립니다.
솔라리스 10 에서 gcc 3.4.6 으로 개발중이구요.
shmat 하고 shmdt 는 하지 않고 있습니다. (이게 혹시 문제가 될까요?)
불안하게 생각되는게 공유메모리를 읽고 쓸때 마다 shmat 를 계속 해주고 있습니다.(이것도 문제가 될까요?)
공유메모리를 읽고 쓰는 함수 마다 shmat 를 해주고 있구요.
각 전문이 들어올때마다 공유메모리를 읽고 쓰는 것을 반복 하고 있습니다.
멀티 쓰레드 환경이고요, pthread 를 쓰고 있고, 공유메모리에 접근할때마다 mutex 는 걸어주고 있습니다.
조언 부탁 드립니다~!
먼저 ipcs -m 명령어로
먼저 ipcs -m 명령어로 현재 생성되어 있는 shared 메모리를 확인해 보세요.
솔라리스라면 /etc/system 에서 전체 shared 메모리 최대값을 지정해 두고
있습니다.
아래 링크 참조하세요.
http://docs.sun.com/app/docs/doc/817-0404/chapter1-33?a=view
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
같은 shmid 에 대해
같은 shmid 에 대해 매번 shmat를 호출할때 동일한 포인터를 넘긴다는
보장이 없습니다. 물론 shmid 가 같다면 같은 영역을 가리키 겠지만
리턴되는 포인터 값은 다를 수 있습니다. 만약 리턴되는 주소값이 매번
틀리다면 shmdt를 쌍으로 호출해야 될것 같네요.
pthread 기반이라면 전역변수로 두시고 shmat를 한번만 호출하는 걸로
하세요. pthread_once_t를 사용해서 shmat 호출은 한번으로 할 수 있습니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
감사합니다. shmat 와
감사합니다.
shmat 와 shmdt 를 쌍으로 호출하도록 수정했습니다.
일단, 테스트를 더 해보아야 하지만, 아직 까진 정상적으로 동작하는 듯 보입니다.
shmat 를 한번만 호출하도록 수정하는 방안도 생각중입니다.
많은 도움이 되었습니다:-)
---
To solve an interesting problem,
start by finding a problem that is interesting to you.
---
To solve an interesting problem,
start by finding a problem that is interesting to you.
공유메모리 포인터를
공유메모리 포인터를 매번 가져오는 것 또한 문제가 될수 있습니다.
공유 메모리의 용량이 어느정도 되는지 모르겠지만 매우 많은 경우에는
매번 포인터를 가져올 때마다 공유메모리 만큼의 프로세스영역에 매핑을 해야하는데
매우 많은 쌍의 포인터를 가져오고 놓아주는 식이 된다면 어느 순간 연속된 메모리를
매핑하지 못해서 그런 현상이 일어날수 있습니다.
가능한 한번만 포인터를 가져와서 사용하도록 하시는 편이 좋을것 같습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
감사합니다. 좋은 걸
감사합니다. 좋은 걸 알았습니다. :-)
---
To solve an interesting problem,
start by finding a problem that is interesting to you.
---
To solve an interesting problem,
start by finding a problem that is interesting to you.
댓글 달기