select 사용중 blocking 관련 질문 입니다.

croae의 이미지

결론적으로 말씀 드리면 select() 사용시 blocking이 걸립니다.

하나의 소켓 디스크립터가 종료 되면 그제서야 밀렸던 연결 소켓 디스크립터가 실행 됩니다.

프로그램 흐름은 서버 와 클라이언트 구조 입니다.

1. 역할별 구분
서버 select 호출 -> 클라이언트 디스크립터 (i) 로 http accept -> 새로운 소켓 디스크립터(p)로 클라이언트 connect()후 메시지 전달 send()-> 새로운 소켓 디스크립터(p)를 통해 클라이언트로부터 메시지 수신 recv()
-> 클라이언트 디스크립터(i)로 http redirect -> 클라이언트 디스크립터(i) FD_CLR(i) 및 소켓 디스크립터 close(i) -> Loop

클라이언트 select 호출 -> 서버의 요청 소켓 디스크립터 (p) accept -> 서버의 요청 소켓 디스크립터 (p) 로부터 수신 recv() -> 수신 메시지 요청 처리 약 50초 지연처리후 소켓 디스크립터 (p) 로 전송 send()
-> 소켓 디스크립터 (p) FD_CLR(i) 및 close(p); -> Loop

위와 같이 동작 합니다.

서버에서 처음 http 로 8080 포트로 접속이 되면 클라이언트로 새로운 소켓을 생성해서 요청 메시지를 전달하고 클라이언트로부터 메시지를 전달 받으면 새로운 디스크립터를 종료 시키고, 그 이후에 http 클라이언트 접속 소켓 디스크립터를
FD_CLR로 초기화 시키고 소켓도 종료시킵니다.

클라이언트는 클라이언트지만 서버 로 accept하고 수신된 메시지를 처리하고 바로 서버에게 리턴후 FD_CLR과 소켓을 close 하는 방식입니다.

근데 클라이언트 부분에서 서버로부터 메시지를 받고 처리후에 다시 서버로 send 하는 과정중 약 50초의 딜레이가 발생하게 됩니다. 50초후 서버에게 결과 send() 이런식이죠.

문제는 서버에서 발생합니다. 서버와 클라이언트간 메시징 처리시 길게 50초라는 딜레이가 생기게 되는데..이때 서버로 접속되는 새로운 세션은 계속 Block 걸리는게 문제 입니다.

하나의 세션이 종료되는 시점 약 50초 후에 그동안 밀렸던 htttp 접속 디스크립터가 밀려서 처리가 됩니다..

하지만 역시 하나의 세션당 50초의 딜레이가 생기다보니 또다시 block 걸리다 세션이 종료 되면 다시 우르르 들어오고...이런 현상이 반복 됩니다.

일단 해결은 했습니다.. 클라이언트 부분에서 50초정도의 딜레이가 나는 부분을 쓰레드로 두고 해결해서 block 걸리는 현상을 해결 하였는데...
도무지 왜 이런 현상이 나타나는지 재현을 해서 테스트중인데도 이해가 되지 않습니다;;

글이 너무 길어서 줄이면..

1. 서버 소켓 accept 이후 select()시 블럭킹, 클라이언트는 형식상 클라이언트지만 구현은 server select()
2. 서버측에서 select() 후 소켓 accept() 이후 새로운 소캣 생성 (이때 새로운 소켓 recv(), send()옵션은 Block)
3. 서버와 클라이언트 처리시간 약 50초 이후가 지나면 그때서야 그동안에 연결 요청했던 소켓 디스크립터들이 우후죽순 처리가 되고 그게 반복됨/

왜그럴지 언질 부탁좀 드릴게요 ㅠㅠ

댓글 달기

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