Non-Blocking I/O 처리 방법에 따른 성능 차이 문의

sjang의 이미지

HTTP Proxy를 구현하는데, 멀티쓰레드 방식을 사용하지 않고, 싱글쓰레드 안에서 non-blocking 소켓을 사용하여 처리하려 합니다.
클라이언트의 여러 접속을 소켓에서 일어나는 이벤트에 따라 처리하는 방식입니다.

문의드리고자하는 것은, proxy이기 때문에 하나의 접속에 대해서 클라이언트와 연결된 소켓 한개와 서버와 연결된 소켓 한개가 생기게 됩니다. 클라이언트가 request를 보낼 때, 처리 방법은 아래와 같이 두 가지가 있을 것입니다.

1. request를 모두 받은 다음에 서버에 연결하여 request를 전송하여 response를 받고, 이것을 다시 클라이언트에 넘겨주는 방식.

2. request의 일부를 받아서 host 정보가 있으면, 이 시점부터 서버에 접속하여 수신한 request의 일부를 보내고, 다시 나머지 request 수신하고 다시 서버에 보내고.... 이런 방식으로 비동기로 처리하는 방식.

1번은 2번에 비해서 복잡도가 좀 떨어질 것이고, 성능은 2번이 좀 더 나을거 같습니다. 그런데, 구현하려는 서비스의 특성상 request 한번과 response 한번 뿐입니다. keep-alive 아니랍니다. 이런 상황이라면 2번 방법으로 했을 때 얻을 수 있는 성능상의 이점이 얼마나 나타날까 하는 것입니다.

2번 방법으로 했을 때, 비동기적으로 송신과 수신이 이루어지므로 수신버퍼와 송신버퍼 사이에 계산이 매우 복잡해질거 같습니다. 이 복잡도를 감수하면서 얻는 성능이득이 얼마나 될까요?

당연히 정확한 수치의 답변을 받을 수 없겠지요?
의견을 말씀해주시는 것으로도 매우 감사드릴 일이지요.

익명 사용자의 이미지

request만을 생각하면 간단할 것 같습니다. POST method로 데이터 잔뜩 날리는 경우가 아니라면 request의 데이터라고 해봤자 수백 바이트일 것이고, 그 정도면 패킷 하나로 바로 도착할 테니, 두 방법의 성능 차이가 없을 겁니다.

하지만 request도 가끔씩 긴 녀석이 있기 마련이고, response 데이터는 꽤나 길어줍니다. 그렇게 되면, client-proxy 및 proxy-server간 통신 속도 모두가 느린 경우 2번 방법의 상대적 성능이 점점 더 눈에 띄게 좋아지겠네요. 하지만 그 정도로 대역폭이 제한된 환경은 잘 없을 겁니다...

그러나!!! 성능이 아닌 다른 이유로 어쩔 수 없이 2번 방법을 택하셔야 할 수도 있습니다. request/response 데이터를 모두 받은 후에 전달을 시작하는 주는 방식을 택하면 그 데이터를 저장해 두기 위한 메모리가 무지막지하게 필요해 질 겁니다. (파일에 저장하는 건 성능 문제 때문에 쉽지 않을 거구요) 사용자가 많은 경우 메모리가 바닥나서 proxy가 버벅이는 경우를 당하지 않으려면 받은 데이터를 얼른 얼른 내보내 주는 게 좋겠고,... 그리하여 결국 2번에 한표입니다.

& squid 같은 cache-proxy-with-filtering-and-many-more나 dansguardian 같은 web filtering 패키지를 참고하실 수 있을 것 같습니다.

neogeo의 이미지

보통 소켓-데몬류 플밍에서 n/b 를 강족하는건

무엇보다 "응답성" 이라는 설명이 많습니다.

예를 들어 1번 같이 코딩할경우 악의적 client 가

세션을 물고 데몬에서 지정한 handshaking 이나

expected data 같은것을 일부러 넘기지 않고 질질 끌고 있으면

코딩한 내용에 따라 time out 이 걸릴때 까지 다음 대기자는 기다리겠지요.

악의적이 아니더라도 접속된 클라이언트의 네트웍이 갑자기 끊긴다던가 하면

서버의 응답성은 비약적으로 떨어질 것입니다.

정말 simple 하고 응답속도가 중요치 않은 서버에서는 사용직함하나

일반적으로는 n/b 가 거의 기본사항으로 굳어져 가고 있는게 정석입니다. (-ㅅ- )

Neogeo - Future is Now.

익명 사용자의 이미지

1번도 n/b로 작성할수 있고 (데이타 버퍼를 두면 되겠지요..) n/b로 작성되어 있다면 위님의 세션을 무는 현상은 일어나지 않겠지요.

클라이언트 --> 서버 전송시 (전부 들어가야만 서버에서 처리를 하던지 말던지 할수 있다.) 1번 스타일에 적합

서버 --> 클라이언트 (Broswer) 일단 보내고 보면 클라이언트 화면에 뭔가 나타난다. 2번 스타일에 적합

아무래서 섞어서 쓰시는 것이 좋을듯 싶은데요..

댓글 달기

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