pthread_create 최대 생성 갯수 문의
글쓴이: koreteck / 작성시간: 월, 2009/06/15 - 9:33오후
안녕하세요.
pthread_create 무한 호출과 관련하여 문의드립니다.
2004년도 계시글에도 pangjun님께서도 같은 질문을 하셨던데(http://kldp.org/node/34871) 답변이 마무리가 안되어 있네요.
그래서 다시 한번 올립니다.
저도 현재 단순 처리를 위해서 필요할 때마다 pthread_create를 호출하여 처리 후, pthread_exit()를 호출하여 종료합니다.
당연히 pthread_join도 사용하고 있습니다.
그래서 한번에 동작하는 스레드 숫자는 최대 2~4개가 동작합니다.
그러나 이 루틴을 반복해서 수행하다보면, pthread_create에서 halt 되어 버리네요.(상황마다 틀리지만 보통 500개 정도의 thread 생성 후, 발생합니다.)
프로세스만 halt가 아니라, 리눅스 시스템 전체가 halt 되어 버리는 상황이 발생하였습니다.
증상은 pangjun님과 틀리지만, 해결방법은 유사할 것이라는 생각이 드네요.
드문 상황이긴 하지만, 겪어보신 분이 있을 것 같다라는 생각도 드네요.
그럼 좋은 하루들 되세요.
Forums:
시스템과 커널 버전에 따라 설정이 다른 경우가 있습니다.
인터넷 검색한 것들을 종합하면,
시스템에서 제공해 주는 쓰레드 최대치 확인은 "cat /proc/sys/kernel/threads-max"
-->유저당도 프로세스당도 아닌 시스템 전체의 최대치(프로세스에서 생성의 한계는 없다는 얘기)
최대치를 늘리고 싶으면, "echo 100000 > /proc/sys/kernel/threads-max"
1thead는 1stack에 할당되며, 스택의 크기는 쉘에서 "ulimit -a"로 확인 가능.
-->결국 쓰레드 생성의 한계는 스택생성에 의한 메모리 한계일 가능성이 높음
저는 이렇게 한꺼번에 많이 생성한 적이 거의 없어서 이런 경험이 없었는데, 이번 기회에 공부되었습니다.
시스템 halt 라
시스템 halt 라 하시니... 전형적인 out-of-memory 의 증상일 것 같은데요.
oom 상황에서 리눅스 커널은 스택 트레이스, 덤프, 메모리 사용량 메시지를 출력하고,
가장 질나쁜 프로세스를 찾아서 죽입니다. 좀 버벅거리고요.
oom 상황이라는 것은 작성하신 코드 어딘가에 memory leak 이 있다는 반증입니다.
시험삼아 돌려봤는데... 쓰레드 최대 갯수를 4개로 한 상태에서 오백만번까지도 pthread_create() 는 문제없이 되던데요.
OTL
두 분 좋은 정보 감사합니다. ^^
두 분 좋은 정보 감사합니다. ^^
=> phonon님께서 말씀하셔던 stack관련 중, pthread_eixt()와 pthread_join()을 사용할 경우 thread가 모든 자원을 반환한다고
알고 있습니다. 할당받은 stack도 반환하지 않을까요? 그리고 드문 경우기는 하지만, 10~20번에도 시스템 Halt가 일어나는 경우가
있더군요. stack 문제는 아닐지도 모른다고 생각하고 있습니다.
=> bushi님 말씀데로 memory leak 문제가 아닐까해서 여러번 확인하였습니다만, top명령으로 used 메모리를 계속 확인했지만
메모리 사용 후, 확실히 반환하는 것을 확인했습니다. 아니면 안보이게 먹고 들어가는 것이 있을 수 있을까요?
조금 더 부가 하자면, thread에서 하는 것은 단순한 반복연산입니다. 그래서 smp 커널에서 multithreading을 하는 것인데 이런 문제가 생기네요.
해결방법이야 thread를 아예 처음부터 만든 후에, 종료전까지 thread에게 데이터를 던져주는 식으로 바꿔도 되기 때문에 문제 되지는 않지만
왜 이런지 너무 궁금하네요.
메모리의 변동 상황을 확인해 보세요.
top명령어로 메모리의 변동을 확인해 보세요.
(비추:프로세스를 꽤 점유)
아니면, "vmstat 5"로 5초마다 메모리의 변동을 보시면서, 메모리 부족이 일어나는지 확인하세요.
예로, 집에서 사용하는 우분투의 스택사이즈는 8Mbytes,
프로젝트의 레드햇Ent4는 10240kbytes(10Mbytes)입니다.
단순한 계산으로 500*10M = 5G가 되는군요.
이런 경우는 모니터닝해서 예상치가 맞는지 확인하는 수 밖에 없습니다.
메모리 변동률 확인.
바로 위에서 말씀 드린 것과 같이 top명령으로 메모리 변동을 확인했습니다.
제가 할당한 만큼만 메모리를 소모하고 해제하고, 다시 할당하고 반복하더군요.
서버급이라 메모리는 8G인데 버퍼 포함 4G도 사용하지 않고 있더군요.
mpstat -P ALL 1 명령으로 CPU 사용량도 체크해 보았지만, 할당한 스레드 수만큼 작업을 할당해서 5%미만 정도만 사용하고 있었습니다.
제가 사용하고 있는 커널이 문제일 가능성도 있을까요?? ^^;; (RedHat 2.6.9-78.ELsmp)
알기 힘들군요.
검색을 해 보았습니다.
sys_times에 대한 버그 보고가 있고 패치하라는 글이 보입니다.
이 문제로 서버패닉이 발생한다니 손해보는 셈치고 패치를 해 보세요.
댓글 달기