동시접속이 1000명이 넘는 서버를 구성할 경우..

sunbee의 이미지

소켓은 nonblocking으로 설정하고, prefork로 프로세스를 여러개 생성합니다.

여러개의 프로세스가 하나의 listen port를 공유하여 select 하고 있습니다..

client의 요청이 계속적으로 일어날 경우 listen port를 공유하다보니, 하나의 프로세스가 client의 접속을 계속 받아들여 "Too many open files" 에러가 뜨더군요...

select를 이용해서 i/o multiplexing을 하는데 select는 하되 accept만 못하게 해야하나요~? 이럴때는 어떻게 처리합니까~?

아님 저런 에러를 감수해야 하는것입니까~?

최종호의 이미지

동시접속 1000명이라도 별 문제가 생기지 않아야 할 것으로 보입니다.
일단은 프로그램에서 소켓을 닫아주어야 하는 부분을 어디선가
놓친 부분이 있는 것이 아닌가 생각됩니다.
아니면 프로세스에서 열 수 있는 파일의 수가 너무 작게 설정이 되어있든가요.
too many open files 를 내는 프로세스의 pid를 알아내서
lsof 등으로 한번 검사해 보시기 바랍니다.
아마 안 닫으신 것이 있지 않을까 생각이 됩니다.

현재 문제와는 상관없겠지만,
하나의 소켓을 여러 프로세스에서 같이 listen하고 있는 경우
thundering herd 문제가 발생할 수 있지 않을까 하는 생각이 듭니다.
이 문제가 성능에 영향을 미치기 시작한다면 accept를 전담하는
프로세스를 앞단에 두거나 포트수를 늘리거나
처리로직을 개선해서 처리능력을 높이는 -_-;; 방향을 잡으셔야 할 것으로 생각됩니다.

익명 사용자의 이미지

Quote:

동시접속 1000명이라도 별 문제가 생기지 않아야 할 것으로 보입니다.
일단은 프로그램에서 소켓을 닫아주어야 하는 부분을 어디선가
놓친 부분이 있는 것이 아닌가 생각됩니다.

최대 접속을 테스트 하기위해서 client에서 접속을 하고 끊지않고 대기 하였습니다... 이부분은 설명되었겠죠~?^^

Quote:

아니면 프로세스에서 열 수 있는 파일의 수가 너무 작게 설정이 되어있든가요.

프로세스가 열수있는 파일의 수는 256으로 기본설정 그대로 놔 두고 테스트 하였습니다.. 일부러 늘이지 않았습니다.

Quote:

현재 문제와는 상관없겠지만,
하나의 소켓을 여러 프로세스에서 같이 listen하고 있는 경우
thundering herd 문제가 발생할 수 있지 않을까 하는 생각이 듭니다

thundering herd 문제는 없어졌다고 들었는데요...
현재 시스템은 solaris9 입니다..

Quote:

accept를 전담하는
프로세스를 앞단에 두거나 포트수를 늘리거나
처리로직을 개선해서 처리능력을 높이는 -_-;; 방향을 잡으셔야 할 것으로 생각됩니다.

님께서 말씀하신데로 다른 방향도 생각해 봐야겠습니당..^_^
답변 감사드립니다.
monac의 이미지

아무리 사용자가 많아도 open file max까지 다다를정도로 되도록 서버가 운영되게 놔두기 보다는, max_user같은 한계값을 두어서 접속을 못하게 막는것이 바람직하지 않을까 합니다. open file max상황이 되면 서버의 동작에 영향을 미칠 수 있으니깐요. 굳이 처리하려 한다해도 accept()에서 저 에러가 나올테니 저절로 처리되지 않겠습니까. 어찌되었든 accept()를 안할수는 없는 노릇이니깐요.

제 어떤 서버의 경우엔 프로그램 설치시 limit 설정을 전부 변경해주기도 합니다. solaris엔 이런게 표준화가 잘되어있어서 좋더라구요. linux는 시스템마다 틀려서 manual을 잘 작성하게했지요.

댓글 달기

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