파일 다운로드 서버 구현시...

mg2000의 이미지

안녕하세요.

제가 요즘 소켓쪽으로 이것 저것 해보는중인데요.

그냥 작은 데이터를 주고 받을때는, 필요한 데이터만 주고 받고 나서 연결을 끊어버리면, 서버에 사용자가 수백명이 몰려도 그럭저럭 쓰레드를 10개 정도 띄워놔도 딱히 별 문제가 없었는데요.

문제는 파일을 주고 받으려니, 클라이언트당 1~2초씩 걸려버리게되면, 10명만 몰려도 쓰레드를 10개 다 쓰고 있어서, 다른 사용자 작업을 처리 못해주게 되네요.

무턱대고 쓰레드를 클라이언트 수만큼 늘리는 것도 좋은 방법은 아닌것 같고...

이런 상황을 대처할만한 요령(?) 같은게 있을까요?

chadr의 이미지

스레드는 가급적 적게 만드시고 한 스레드에서 여러 사용자의 입출력을 처리 하도록 구성하시면 됩니다.
물론 소켓은 비동기모드로 작동 시켜야합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

mg2000의 이미지

파일을 한번에 다 보내주지말고, 사용자 별로 돌아가면서, 쪼개서 보내줘야 하는걸까요?

송효진의 이미지

epoll 이 답안이 될듯 합니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

mg2000의 이미지

제가 리눅스뿐만 아니라 다른 유닉스에서도 개발해야하는지라... ㅠ.ㅠ

epoll을 쓰더라도 클라이언트에게 작업을 나눠주는건 직접 구현해야 하는 것 아닌가요?

tj의 이미지

libevent같은 거 쓰시면 되긴하는데, "다른" 유닉스가 어떤 애들이냐에 따라서 성능차이는 심하게 날 수 있습니다. 쓰레드 scalability도 제대로 된 async도 없는 경우면 힘듭니다. 플랫폼 영향없이 어느정도 scalable하려면 프로세스 여러개 만든후 fd들을 여러 뭉치로 나눠서 select로 보면 되는데 이것도 그래봤자라서 애초에 타겟 플랫폼을 정하고 어떤 기능이 있는지 알아보고 시작하시는 게 좋습니다.

근데 어느 정도 성능이 필요한건가요? 어지간하면 그냥 단순하게 만들어도 별 문제는 없을겁니다.

mg2000의 이미지

AIX나 솔라리스 포팅도 염두해 둬야 하고...

수백명 정도는 동시에 다운로드(또는 업로드) 가능하게 만들어야 해서 고민이네요...

일단은 단순하게 만들어서 테스트를 좀 해봐야 할듯..

tj의 이미지

수백명 정도면 concurrency가 문제가 될 일은 없고 그냥 프로세스를 수백개를 만들어서 해도 됩니다. IO 병목이 주요 문제일 거 같은데 이런 경우에 async로 만들면 오에스 별로 aio 지원 범위나 방법이 다른 경우가 많기때문에 굉장히 골치 아플 수 있습니다. 데이터셋 크기와 기대 대역폭에 따라 다르겠지만 시피유가 사용량이 문제가 될 이유는 없을 것 같습니다.

tj의 이미지

이거 예전엔 그랬는데 요즘엔 꼭 그렇진 않습니다. epoll로 async로 하나 클라이언트마다 쓰레드 하나씩 붙이나 성능 차이 사실상 없습니다. 유일하게 문제가 될 수 있는 부분이 스택의 어드레스스페이스와 메모리 사용량인데, 이것도 왠만한 경우에 크게 문제가 될 정도는 아니고, 극단적인 경우에도 조금 조심해서 코딩하고 파라미터 맞춰주면 괜찮습니다. 아이들 세션들이 많으면 걔네들 모니터링하는데는 epoll 쓰는 게 좋겠지만 적어도 리눅스에서 성능상의 이유로 일반적으로 쓰레드를 가급적 적게 만들 이윤 없습니다.

댓글 달기

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