다중 접속 구조에 대한 고민

bueline의 이미지

C/S 프로그래밍을 하면서 서버 구조에 대해서 생각하고 있는데요
동시에 6만명 이상의 클라이언트가 서버에 접속해서 사용하려고 하는데요
접속과 관련해서 서버가 버틸 수 있는 구조 방식을 어떻게 해야할지 고민이 되어서 질문드립니다.

초보적인 서버 구조만 개발하다가
처음으로 정말 많은 사용자들에 대해서 서버 접속을 고려하게 되었는데요

지금까지는 그냥
socket으로 사용자들 접속을 받은 다음에 들어오는 Packet에 대해서
STL에서 제공하는 Queue에 넣은 다음에 work thread를 깨워서 작업하는 방식을 사용했는데요

STL에서 제공하는 Queue를 사용하다보니까 용량문제도 있고해서요
6만명 이상이 동시에 접속하면 다 처리를 못하더라구요

처음 socket 접속시에는 epoll을 사용해봤는데요
socket에 접속하는 사용자들마다 thread를 만들어서 제공해야 하는지
어떻게 구조를 잡고 개발해야 할지 고민이 되네요

밑도 끝도 없이 이렇게 질문드려서 죄송한데요
다중 접속에 대해서 조언 좀 부탁드릴께요

sozu의 이미지

one thread가 6만 가입자를 모두 처리하는 것과 one-thread가 한가입자씩 처리하는 것은 좋아 보이지 않습니다.

보통 시스템 사양 (CPU 갯수 등)을 고려하여 일정한 갯수의 thread pool을 운용합니다.

각 thread가 일정한 가입자수만 처리할수도 있고 (round-robin scheduling.. 가입자 별 task의 computation이 일정하다면 좋을듯..)

현재 thread의 상태에 따라 dynamic scheduling을 할 수도 있습니다.

thread pool 관련해서 조사해 보시면 좋을것 같습니다.^^

I/O multiplexing 기법을 어느것을 쓰느냐는 그 다음문제 일듯...

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

bueline의 이미지

조언 주셔서 감사드립니다
우선은 말씀대로 더 조사해봐야겠네요

jos77의 이미지

돈만 많으면 L4 스위치 써서 하드웨어적으로 해결하는게 제일 좋다고 생각하고요.

thread pool 이 좋긴 하지만... 프로세스 처리 부하가 크지 않을 경우 select / poll 만 잘 써도 초당 1만명 까지는 가능한 걸로 알고 있습니다.
(단, select / poll 을 잘 쓴다는 게 밑도 끝도 없긴 하죠)

limited multi thread 가 개발하긴 가장 편할 겁니다.

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

bueline의 이미지

돈이 어느정도 제한있는 상태에서 만드는건데
select pool...
사용법은 아는데 어떻게 구조를 잡고 사용해야 할지 고민이네요 ㅋ

NoBrain의 이미지

동시에 6만명이 중요한게 아니라 어떤크기의 데이터가 얼마나 자주 움직이는지가 더 중요합니다.
실험을 해봐야 하겠지만 STL보다 좋은 자료구조가 있다면 직접 설계해서 사용하는게 좋을 것 같습니다.

프로그래머는 늘 프로그램만 생각하는 경향이 있는데 서버를 좋은 것으로 업그레이드 하는 방법도 생각해야 합니다.
프로그램이 좋다면 서버 가격이 좀 내려 가겠죠.

서버를 분산하는 것도 좋습니다.
사용자가 늘 접속해 있지 않다면 L4도 좋습니다.
부하가 많은 로직은 다른 서버를 붙여서 시스템 전체를 키우는 것도 좋은 방법입니다.

자세한 건 조건에 따라 그 때, 그 때 달라서 여기에 설명하기에는 좀 무리가 있네요.

bueline의 이미지

네 답변 감사드립니다.
STL을 사용할 예정이구요. 직접 설계를 다하기에는 시간상의 어려움때문에요

사용자는 늘 붙어있지 않지만 물리적 하드웨어는 하나로 해야하는 어려움이 조금 있네요
다른곳 소스들을 보면 많은 방법이 있는것 같은데
어떻게 적용해야할지 고민중에 있습니다.

패킷은 그냥 단순하게 한번씩 와서 그 데이타를 DB에 저장하면 되는거구요
받는 크키는 아무리커도 300Byte를 넘기지는 않을것 같네요

댓글 달기

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