pthread_create 최대 생성 갯수 문의

koreteck의 이미지

안녕하세요.

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님과 틀리지만, 해결방법은 유사할 것이라는 생각이 드네요.

드문 상황이긴 하지만, 겪어보신 분이 있을 것 같다라는 생각도 드네요.

그럼 좋은 하루들 되세요.

phonon의 이미지

인터넷 검색한 것들을 종합하면,

시스템에서 제공해 주는 쓰레드 최대치 확인은 "cat /proc/sys/kernel/threads-max"
-->유저당도 프로세스당도 아닌 시스템 전체의 최대치(프로세스에서 생성의 한계는 없다는 얘기)

최대치를 늘리고 싶으면, "echo 100000 > /proc/sys/kernel/threads-max"

1thead는 1stack에 할당되며, 스택의 크기는 쉘에서 "ulimit -a"로 확인 가능.
-->결국 쓰레드 생성의 한계는 스택생성에 의한 메모리 한계일 가능성이 높음

저는 이렇게 한꺼번에 많이 생성한 적이 거의 없어서 이런 경험이 없었는데, 이번 기회에 공부되었습니다.

bushi의 이미지

시스템 halt 라 하시니... 전형적인 out-of-memory 의 증상일 것 같은데요.
oom 상황에서 리눅스 커널은 스택 트레이스, 덤프, 메모리 사용량 메시지를 출력하고,
가장 질나쁜 프로세스를 찾아서 죽입니다. 좀 버벅거리고요.

oom 상황이라는 것은 작성하신 코드 어딘가에 memory leak 이 있다는 반증입니다.

시험삼아 돌려봤는데... 쓰레드 최대 갯수를 4개로 한 상태에서 오백만번까지도 pthread_create() 는 문제없이 되던데요.

OTL

댓글 첨부 파일: 
첨부파일 크기
Plain text icon max_thread.c.txt1.69 KB
koreteck의 이미지

두 분 좋은 정보 감사합니다. ^^

=> phonon님께서 말씀하셔던 stack관련 중, pthread_eixt()와 pthread_join()을 사용할 경우 thread가 모든 자원을 반환한다고

알고 있습니다. 할당받은 stack도 반환하지 않을까요? 그리고 드문 경우기는 하지만, 10~20번에도 시스템 Halt가 일어나는 경우가

있더군요. stack 문제는 아닐지도 모른다고 생각하고 있습니다.

=> bushi님 말씀데로 memory leak 문제가 아닐까해서 여러번 확인하였습니다만, top명령으로 used 메모리를 계속 확인했지만

메모리 사용 후, 확실히 반환하는 것을 확인했습니다. 아니면 안보이게 먹고 들어가는 것이 있을 수 있을까요?

조금 더 부가 하자면, thread에서 하는 것은 단순한 반복연산입니다. 그래서 smp 커널에서 multithreading을 하는 것인데 이런 문제가 생기네요.

해결방법이야 thread를 아예 처음부터 만든 후에, 종료전까지 thread에게 데이터를 던져주는 식으로 바꿔도 되기 때문에 문제 되지는 않지만

왜 이런지 너무 궁금하네요.

phonon의 이미지

top명령어로 메모리의 변동을 확인해 보세요.
(비추:프로세스를 꽤 점유)
아니면, "vmstat 5"로 5초마다 메모리의 변동을 보시면서, 메모리 부족이 일어나는지 확인하세요.

예로, 집에서 사용하는 우분투의 스택사이즈는 8Mbytes,
프로젝트의 레드햇Ent4는 10240kbytes(10Mbytes)입니다.
단순한 계산으로 500*10M = 5G가 되는군요.

이런 경우는 모니터닝해서 예상치가 맞는지 확인하는 수 밖에 없습니다.

koreteck의 이미지

바로 위에서 말씀 드린 것과 같이 top명령으로 메모리 변동을 확인했습니다.

제가 할당한 만큼만 메모리를 소모하고 해제하고, 다시 할당하고 반복하더군요.

서버급이라 메모리는 8G인데 버퍼 포함 4G도 사용하지 않고 있더군요.

mpstat -P ALL 1 명령으로 CPU 사용량도 체크해 보았지만, 할당한 스레드 수만큼 작업을 할당해서 5%미만 정도만 사용하고 있었습니다.

제가 사용하고 있는 커널이 문제일 가능성도 있을까요?? ^^;; (RedHat 2.6.9-78.ELsmp)

phonon의 이미지

검색을 해 보았습니다.
sys_times에 대한 버그 보고가 있고 패치하라는 글이 보입니다.
이 문제로 서버패닉이 발생한다니 손해보는 셈치고 패치를 해 보세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.