non-block socket이 일반 socket보다 속도가 느린가요?

superkkt의 이미지

block socket을 사용할때는 랜상에서 초당 10메가의 속도로 파일 전송이 되었습니다. 그런데 non-block으로 바꾸고 EAGAIN or EWOULDBLOCK 에러를 리턴할때 못보낸 데이터를 재전송해주는 코드를 추가했더니 초당 5~6메가 정도밖에 속도가 안나오네요.

데이터 재전송 해주는 코드는 다시 파일을 읽는게 아니라 메모리에 있는 내용을 다시 보내주는거라서 특별히 오버헤드가 발생할 부분은 없습니다. 다만 한번에 보낼걸 두번에 보내는거 빼고는요..

그리고 non-block에서 파일전송시 EAGAIN을 리턴할때는 send buffer에 write하는 속도를 네트워크가 받쳐주지 못해서 그런건가요? 그렇게 보기엔 EAGAIN 나올때마다 write 된 사이즈가 일관되게 나오는게 좀 이상해서요.. 예를들어 write에 8192바이트를 요청했는데 5142바이트만 쓰고 리턴하는것처럼 항상 일정한 값만 쓰고 리턴을 합니다.

non-block이 느리다면 다른 대안은 어떤게 있나요? 지금 생각나는건 socket options에 SO_SNDTIMEO를 설정하는 방법과 write전에 alarm을 설정하는 방법인데.. 또 다른 방법이 있나요?

송효진의 이미지

제가 개념이 안서서 그런걸지도 모르겠습니다만,
block socket 이란것은 thread 로 구현할 수 있도록
서버의 한 포트에 non-block 하게 오는 정보를 세션별로 block 하게 동작시키는것 아닌가요?

결국 내부적으로는 non-block 의 확장형태가 아닌가 해서요.

델파이를 보다보니 indy 라는 컴포넌트가 block 만을 지원하는데,
쓰레딩이 알아서 잘 되더라고요. 얘만 그런건가... :oops:

소타의 이미지

poll 등을 이용해서 POLLOUT 이벤트가 발생할 때 보내보세요. 성능 저하가 심할것 같지만 그렇지 않습니다
nonblock 소켓 사용시 자꾸 EAGAIN이 발생하는 이유 중 큰 것은 말씀하신대로 네트웍보다 소켓버퍼로 복사하는 속도가 빠르기 때문입니다
그리고.. 타이머나 usleep 등으로 시간텀을 주는건 엄청난 성능 저하가 올겁니다;;

그리고 파일을 소켓으로 보내실 때는 sendfile(2) 를 참조해 보세요. 파일 읽어서 버퍼에 놓고 보내는 것보다 약간 빠릅니다~ 경험상 sendfile은 block쪽보다 nonblock쪽이 전송이 더 빨랐습니다.. 이건 상황마다 좀 달라질 수 있겠구요..

아 그리고 시스템콜들(2)은 횟수가 적으면 적을 수록 좋습니다. 특히 쓰레드로 작업 시 크리티컬 섹션에서는 없으면 없을수록 좋습니다. -.-;;

superkkt의 이미지

제가 write를 잘못 사용해서 속도저하가 발생했습니다. write의 리턴값이 요청값과 다르면 재전송 코드가 실행되도록 해야되는데 그자리에서 다시 한번 write를 하는 wrapping 함수를 사용하고 있어서 문제가 생겼던거네요.

적어도 제가 테스트한 LAN 환경에서는 non-block과 block socket의 속도 차이는 발생하지 않는군요. 구형 스팍 머신(솔라리스 8)에서 테스트 해본결과 예상외로 재전송이 많이 발생하더군요. 그래서 성능 저하가 생길줄 알았는데 별반 차이가 없네요.

======================
BLOG : http://superkkt.com

소타의 이미지

non-block, block 소켓이라고 성능에 크게 영향이 있는게 아니라 아주 약간 있습니다. 클라이언트 하나 접속해서는 그 차이를 측정 조차 할 수 없을 정도가 대부분이죠.. sendfile같은 zero-copy나 온갖 폴링 관련(select, poll, epoll, kqueue, RTS 등등)된 테스트도 몇 개 수준의 클라이언트들로는 성능 차이를 측정조차 힘듭니다.
적어도 세션 천개는 물리고 요청은 몇만번을 해봐야 그 차이가 눈에 띄는 정도걸랑요
그래서 어떤 소켓 모델을 쓰느냐 어떤 폴링 모델을 쓰느냐 보다는 IO계획이나 전체적인 구조가 성능에 훨씬 많은 영향을 미치게 됩니다 ㅎ

댓글 달기

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