udp에서 select를 쓰려고 합니다..

onlymg의 이미지

간단히 동작할 수 있게 프로그래밍을 했는데요 의문점이 드는게 있어서 질문합니다..

1. for(fd = 0; fd < FD_SETSIZE; fd++)을 돌릴 때,
FD_SETSIZE 사이즈를 보니 1024 byte더라고요 포문을 돌게 될때
만약 맨 마지막에 작업할 게 생기면 효율적이지 않잖아요...
혹 어떤 파일디스크립터에 이벤트가 발생하면 그 파일디스크립터를 받아올 수
있는 방법은 없을까요..??
없다면 포문을 계속 돌아 이벤트가 생긴 파일디스크립터를 찾는데 속도면에서
프로그램에 악영향을 미치진 않을까요?(초당 몇백만의 패킷을 받는다고 가정합니다.)

2. tcp select에서와 다르게 udp select에서 에러처리는 받는 패킷이 없을때만
하면 되겠지요??

읽어주셔서 감사합니다... 아시면 답글 좀 부탁드릴게요~ 즐거운 하루 되세요~

rein의 이미지

1. 만 답해보자면,
1024bytes -> 256개의 fd. (물론 커널 설정으로 올릴 수 있지만)
=> 256개에서 초당 몇 백만개면 연결당 백만개란 소린데 이런 연결은 없습니다(...)

실제로 연결이 256개를 초과하는 경우 여러 개의 fd_set을 쓰던가 다른 방식의 I/O를 써야합니다. 프로그램 자체의 성능도 for 문 때문이라기보단 일일이 찾아서 검사해야한다는 점에서 떨어지고 그런 경우에 대안은, epoll이나 kqueue 이 될 겁니다. 이건 프로그래밍 모델이 조금 다르니 좀 더 찾아보셔야하겠지만, 정말로 저런 수준의 처리를 원한다면,
* 분산 시스템을 구성하고
* 각 분산 서버들도 효율적인 I/O (epoll 같은 거)
를 사용하는 구조를 만들어야합니다.

네트웍 프로그래밍을 할 때는 언제나 그렇지만, 현실적인 가정을 하세요. 기껏해야 수개~수십개 연결이 풀로 돌아도 select로 잘 됩니다. 반면에 가정이 정말 저정도라면 분산시스템/비동기I/O류를 써야겠죠.

onlymg의 이미지

흠.. 초당 패킷이 100만이라고 말씀드린건 그 정도를 처리하는 프로그램을 만들려고 말씀드린거에요..
연결당 백만이라는 말씀은?? 위에 말씀드린건 한 서버에서 받는 최대 패킷량을 말씀드린거에요..

초당 100만의 패킷이 온다면 select에 이벤트가 발생해서 포문으로 이벤트 발생 디스크립터를 얻으려면 꽤나 많은 시간이 걸리겠네요..
크~ 흠.. 이벤트가 발생하면 바로 바로 처리 할 수 있는 RTS나 epoll이 나을까요..

구현하고자 하는 루틴은,
약 초당 최대 백만개 정도의 패킷이 오면
받아서 처리하는 루틴인데요..
들어오는데로 바로 바로 처리할 수 있게 만들고 싶습니다.
처음에는 epoll + thread 를 생각하다가 select + thread 로 바꿔서 구현할려고 하고 있습니다.

조언 좀 부탁드립니다~~~

rein의 이미지

연결당 백만 -> 연결당 만 정도가 되겠지요 (연결이 FD_SET 크기에 따라 백개 수준이라면)

초당 패킷이 백만개면, CPU 코어가 16개, 메모리가 32GiB 인 시스템이 있을 때, 패킷하나하나마다,
CPU 타임은 1.6 * 10^-8초 (0.0001 ms) == 3Ghz CPU 기준으로 3클럭의 시간입니다. 최대해봐야 명령어 3개입니다
(패킷에만 모든 메모리를 써도)패킷 하나당 34KiB 이하의 메모리. 이건 좀 넉넉하지만, 패킷을 받는데 필요한 공간과, 처리하는데 필요한 공간의 총합입니다.
네트웍 인터페이스는 저보다 더 엄격하게(...) CPU 타임이 줄어들겠죠.(네턱 인터페이스가 스스로 코어를 여러개 돌릴 순 없을테니)

일단 전 그런 시스템이 가능한지부터가 의심이 가는데요 -_-a

어차피 단일 시스템이 아니라 분산 시스템으로 간다면 그건 얘기가 많이 달라지고, 저 가정대로라면
core 수 2배정도의 스레드 + epoll 말고는 답이 없지 않을까 합니다만.(실제 구현은 사실상 불가능하다고 생각됩니다)

onlymg의 이미지

관심 가져주시고 답글 달아주셔서 감사합니다..

제가 생각하기로는 한 유저가 초당 약 3~4개의 패킷을 보내는데요, 동접의 유저가 약 20~30만
이라고 생각해서 단순히 곱셈을 해서 계산하여 나온 결과입니다...

rein님께서 말씀하신대로라면 분산 시스템(어떻게 구현해야할지 전혀 모른다는 ;;)으로 가거나 서버장비를 늘리는 수밖에 없겠군요... ?!

댓글 달기

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