[완료] 리눅스 멀티쓰레드 소켓 프로그램과 최대 파일개수
솔라리스에서 운영하던 프로세스를 리눅스로 마이그레이션을 하고 있습니다
해당 프로세스는 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);
도움이 될까 해서
http://www.randombugs.com/linux/tuning-file-descriptors-limits-on-linux.html
http://prefetch.net/blog/index.php/2009/07/31/increasing-the-number-of-available-file-descriptors-on-centos-and-fedora-linux-servers/
해당방법은^^;
댓글 감사합니다
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
/proc 밑은 신경쓰지 마세요.뭐가 생성되는 것도
/proc 밑은 신경쓰지 마세요.
뭐가 생성되는 것도 아니고 copy 되는 것도 아니고,
그 프로세스에서 열고 있는 file/socket descriptor 를 '보여주는' '인터페이스' 일 뿐입니다.
쓰레드에선 자원이 공유되니 '모두 보여 줄 뿐' 입니다.
[bushi@rose x]$ gcc -o pt
감사합니다
아, 그렇군요
다른 문제였군요
감사합니다~
수고하세요
>/dev/null 2>&1
댓글 달기