[질문] 반드시1019번째에 socket: Too many open files 에러가 발생 됩니다.

kimyh의 이미지

클라이언트에서 5초마다 간단한 작업을 수행하여 이전 작업과 방금 작업한 결과를 비교하여 다르면 서버에 작업결과를 전송하고, 작업결과가 같으면 서버에 전송해주지 않는 아주 간단한 소켓 프로그램입니다.

그런데 프로그램이 수십분간 수행되다가 어떤경우에는 "socket: Too many open files"
또는 어떤 경우에는 "세그멘테이션 오류" 라는
메세지를 내 보내고 프로그램이 종료되어 버립니다.

그래서 printf("num; %d\n", i++); 로 확인해보니 정확하게 1019번째
이런 현상이 나타나더군요.

조치방법을 검색해보니
/etc/security/limits.conf 파일에
truefeel soft nofile 4096
truefeel hard nofile 6144
를 추가해 주던가

또는 /etc/rc.d/rc.local 파일에
echo 4096 > /proc/sys/fs/file-max
echo 16384 > /proc/sys/fs/inode-max를
추가해주고 새로 부팅을 하라고 해서 그렇게 해봤는데도 결과는 마찬 가지입니다.
열고 닫는 파일은 달랑 한줄짜리 30바이트도 않되는 간단한 파일이며 파일 클로스를 반드시 해 주었는데도
왜 이런 현상이 나타나는지 모르겠군요.
도움좀 주세요.

왜 1019번째에 이런 에러가 발생하고 조치방법은 무었인지 알고 싶군요.

참고로 말씀 드리면 프로그램은 5초 이내에 파일을 두개 열고 닫는 부분이 있는데 혹시 이 부분이 관련이 있는걸까요?

mr.lee의 이미지

커널 버젼따라 아마 다르겠지만 한 프로세스당 디폴트 가용 fd가 보통 1024입니다. 기본적으로 stdin,stdout,stderr 3개가 사용되고.. 또 다른데 몇개 사용되나 봅니다. 그래서 1019번째에 실제론 아마 1025개째가 되었을것입니다.

조치는 커널옵션에서 수정해주셔도 되는데요 일단 그게 문제라기 보담.. 프로그램 자체에서 계속 신규로 소켓 fd를 생성하고 계신게 아닌가 싶군요.

프로그램에서 소켓이나 파일등의 fd를 닫지 않고 계속 추가 생성하는게 있는지 한번 확인해 보세요. 멀티 쓰레드 프로그램이라면 그런 부분까지 염두에 두고 살펴보셔야 할겁니다.

dormael의 이미지

프로세스 실행 전에 ulimit -n 으로 몇개 설정되어 있는지 확인해 보시고..

lsof -n | grep "어쩌구" | wc -l 로 해서 실제 프로세스에서 연 파일 디스크립터 갯수를 확실히 확인해보시는게 좋을듯 합니다.

혹시 환경이 다르게 적용될 수 있는 상황은 아니겠죠?

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

kimyh의 이미지

계속 작업중이어서 이제야 들어와 봤습니다.
두분 답변 정말 감사합니다.
아직도 해결을 못하고 있는데 문제는 ulimit -n 으로 확인 해보니 1024 로 되어 있더군요.
제가 원하는건 5초마다 작업결과가 이전과 다르게 나올경우에는 소켓을 열어 서버에 작업결과를 보내주고 다시 소켓을 close 하고 하는 작업을 끊임없이 해야 하거든요.
그런데 user limit 만끔만 소켓을 열고 닫을수 있다면 이걸 늘려본들 무슨 소용이 있을까요.
이럴경우 user limit에 관계없이 계속적으로 소켓을 열고 닫을수는 없는지 궁금 하군요.
도와 주시면 감사하겠습니다.
참고로말씀드리면 로직은 while()문 내에서 5초마다 작업을 하고 결과를 비교하고 소켓을 생성하고 닫고 하는 작업을 하도록 되어 있습니다.

==========================================================
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.

살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.

익명사용자의 이미지

동시에 1000여개가 넘는 소켓을 사용할 필요가 없어보이는데요.

동시에 사용할 수 있는 fd가 1024개로 제한되어 있을 뿐이지,
열고 닫은 것은 무제한입니다.

위의 문제는
열었던 소켓을 반납을 제대로 못하는 문제로 보입니다.

댓글 달기

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