[완료] 리눅스 멀티쓰레드 소켓 프로그램과 최대 파일개수

dreampia의 이미지

솔라리스에서 운영하던 프로세스를 리눅스로 마이그레이션을 하고 있습니다

해당 프로세스는 client연결시 마다 client 데이터를 읽는 reader thread와
client에게 데이터를 전달하는 writer thread를 생성합니다

솔라리스에서는 /proc/(pid)/fd 이하에 연결된 소켓이 보이고
/proc/(pid)/lwp/(tid) 밑에 thread에 대한 정보가 있는데
tid이하에는 fd에 대한 정보는 없습니다

그런데 리눅스는 보니 /proc/(pid)/fd 이하에 연결된 소켓이 보이고
또한 /proc/(pid)/task/(tid)/fd 이하에도 /proc/(pid)/fd에 있는 socket에 대한 정보가
그대로 있으면서 결국 문제가 발생하더군요

보통 하나의 프로세스에서 최대 400명의 client를 접속시키고 있습니다
그럼 800개의 thread와 400개의 socket이 생성됩니다

그런데 리눅스에서는 모든 thread가 fd를 가지고 있어
최소 800(thread수) * 400(fd수) 이상이 fd이하에 파일이 생성되면서
Resource temporarily unavailable 에러가 발생합니다

/etc/sysctl.conf에 fs.file-max = 131072를 이정도 잡아봤자 200명 조금 넘게 접속이 가능하더군요

그래서 제가 하고 싶은 질문은? ( pthread 사용합니다 )
thread 생성시에 /proc/(pid)/task/(tid)이하에 fd/가 copy 안되게 할 수 있는 방법이
소스상 또는 시스템 설정에서 있는건가 하는겁니다

아니면 멀티 쓰레드 소켓 프로그래밍에서 최대 파일수를 어떻게 하고 있는지

제가 뭔가 잘못 아는건지 잘못하고 있는것이 있는지...알고 싶습니다

pthread_create()시에 아무 옵션주지 않고 pthread_detach()만 별도로 하고 있습니다

    retr = pthread_create(&tidr, NULL, Reader, (void *) index);
    retw = pthread_create(&tidw, NULL, Writer, (void *) index);

dreampia의 이미지

댓글 감사합니다

max fd늘리는 방법은 알고 있습니다

처음 8192에서 부터 계속 늘리면서 65536 -> 131072까지 늘려서 client접속을 조금씩 올렸는데요

fd를 이렇게 무한대로 늘려놔야 하는건지에 대한 의문이 들어서요

원래 threads라는 것이 main processes와 자원을 공유하는 건데
이렇게 각 threads마다 fd가 생성되면 threads라는 이름이 무색하다는 생각이 들어서요..

제가 하나의 프로세스에 client를 400명을 붙이려면
client하나당 2개의 threads가 생성되므로 800 * 400 = 320,000 개만큼의 max fd를 설정하면 됩니다

근데 이건 방식이 이상하다 생각이 들어서

threads생성시에 /proc/(pid)/task/(tid) 이하의 fd/ 에 main process의 fd/가 copy가 안되게 하는 방법이 있는지를 알고 싶은 겁니다

>/dev/null 2>&1

bushi의 이미지

/proc 밑은 신경쓰지 마세요.
뭐가 생성되는 것도 아니고 copy 되는 것도 아니고,
그 프로세스에서 열고 있는 file/socket descriptor 를 '보여주는' '인터페이스' 일 뿐입니다.
쓰레드에선 자원이 공유되니 '모두 보여 줄 뿐' 입니다.

bushi의 이미지

[bushi@rose x]$ gcc -o pt pt.c -lpthread -Wall -O0
[bushi@rose x]$ ./pt
stacksize: 10485760
303: thread: Resource temporarily unavailable
[bushi@rose x]$ ./pt 1048576
stacksize: 1048576
841: thread: Resource temporarily unavailable
[bushi@rose x]$

댓글 첨부 파일: 
첨부파일 크기
Plain text icon pt.c.txt1.27 KB
dreampia의 이미지

아, 그렇군요
다른 문제였군요

감사합니다~

수고하세요

>/dev/null 2>&1

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.