select함수의 검사 구간의 낭비?

wnldirqhrdyd의 이미지

select함수 사용한 서버 개발중입니다.

예를 들어 클라이언트 1000명이 붙으면 select가 검사하는 구간이 1000이겟죠
근데 999명이 나가버렷을경우
클라이언트는 1명이라도 검사 구간은 1000이라는 생각이 들어
비효율적이라 생각이 듭니다

제 생각이 맞는건지,
맞다면 어떤 처리가 좋을지 알려주실래요? ^^?

bugiii의 이미지

그 문제 때문에 poll 이 나왔었고 현재는 시스템마다 서로 다른 이벤트 검사 루틴을 제공합니다.

/dev/epoll, epoll, kqueue 등을 검색해보세요. 윈도경우에는 completion port 를 이용하는데 이것과는 개념이 조금 틀린 것이지만 마찬가지로 다중 입력을 처리하는 곳에 사용됩니다. Unix 계열에서 aio_* 가 제공되는 시스템도 있지만, aio 자체적으로 이벤트를 검사하는 것이 아니라 앞에 나열된 것들과 결합하여 사용합니다.

개인적으로 FreeBSD의 kqueue는 많이 사용해봤는데, 안전성이나 성능면에서 아주 만족스러웠지만, 생짜로 kqueue를 그냥 사용하기에는 조금 번잡스러웠다는 (불편하다는 것은 아니고) 기억이 납니다. 리눅스 포팅 문제도 있었고요.

이런 것을 하나의 API로 처리하게 해주면서 편하게 개발할 수 있도록 해주는 libevent 라는 것도 있습니다. vpn 장비를 만들때 이 라이브러리를 사용했는데, 결론은 사용하기도 적당하고 포팅 걱정도 없고 해서 참 좋았습니다.

wnldirqhrdyd의 이미지

답글 감사합니다.. ㅎ
그렇다면, select를 사용하고
접속되 있는 클라이언트의 수가 많이 줄었을때

예로 0~999 의 클라이언트가 잇다가 0~100까지 밖에 남지 않았을경우
검사하는 구간의 값을 임의적으로 줄여줄수 있는지,
줄여줘도 되는것인지가 궁금합니다

물론 순차적으로 뒤의 101~999까지의 클라이언트가 나갔다는 전제 이겠죠
중간중간 비어있다면, 불가능할테니 말이죠

이런 불필요한 검사의 범위를 줄여줄수 있나요?
코딩으로 가능한 구현일까요?
또한, 그에 대한 효과는 어느정도일지..

bugiii의 이미지

말씀하신대로 줄여봤자, 최악의 경우 항상 1000개를 검사하게 될 것이고, 대부분 몇백정도에서 왔다갔다 하겠지요. 줄여봤자 그 경우는 없앨 수 없는 것이므로 의미없다고 생각합니다. 그 문제만을 해결하시려면, poll로 전환하시고요.

제 경험으로는 select를 잊어버리시고, 제시해 드린 다른 솔루션으로 전환하시는게 좋다고 생각합니다.

mg2000의 이미지

다 검사해야 하는건 마찬가지 아닌가요?

bugiii의 이미지

poll은 필요한 fd만 담습니다. select는 필요한 fd들 중 최대값을 이용합니다.

이명수의 이미지

그런데 저는 잘 모르지만,
그런 이유라면 poll을 사용할 때 오히려 CPU 사용을 더 낭비하지 않을까요?
접속 시도가 없었는데도 계속 체크를 해봐야 하잖아요

select의 경우 비트마스크를 체크하기 때문에 1000개를 검사하더라도 1000번 검사하는 것이 아닌 것으로 알고 있습니다
10번만 검사해도 1024개 중 누가 접속을 시도 했는지 찾을 수 있는 것으로 알고 있습니다

사실 저도 poll과 select 중 어느 상황에서 어느 것이 더 효과적이고 효율적인지 잘 몰라서 항상 이게 궁금했는데
얼핏 poll은 접속 시도가 많은 서버에서 효과적이고
select는 접속 시도가 상대적으로 많지 않은 서버에서 효과적이지 않을까 하는 생각도 들긴 하는데
확실하지는 않아서...

실제로는 어떤 것이 주로 쓰이고 효율, 효과는 어떤지 궁금하네요

댓글 달기

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