네트워크 상에서 송신 패킷이 너무 많으면 못 받는 경우도 있나요?

trymp의 이미지

센터중앙에 Server가 있고 공인망을 통해 여러군데에서 300개가 넘는 client가 설치되어 있습니다.

client에서 request 를 3초주기로 보내고 server에서 바로 reply 를 보내줍니다.

통신 프로토콜은 UDP 이고 데이터 전송량은 거의 없습니다. 100byte 이하입니다.

Server쪽에서 select() 로 소켓의 recv 상태를 체크합니다. 그리고 client session list 를 관리해서

request packet 을 보내는지를 9초 간격으로 pthread 를 돌려서 체크합니다.

3초마다 보내기로 해서 웬만에해서는 9초안에 다 request 패킷이 오는데, 몇몇 client 들은

세션 체크 할 때 죽은 것으로 판단합니다.

이것이 client 쪽은 다 확인해 봤는데 3초주기로 잘 보내고 있고, 네트워크 상에서 문제인지

아니면 Server 데몬이 이상해서 패킷 수신을 제대로 못하고 있는 것인지 판단이 모호합니다.

죽었다고 판단하는 client 도 수초내로 다시 살았다고 판단합니다.

논리적으로는 죽은 세션이 나오면 안되는데 왜 나오는지 모르겠습니다.

이 상황에 대해서 고수님들의 조언 부탁드립니다.

obbaya의 이미지

UDP 면 버퍼상태에 따라서 loss가 생기는데요

제 경험으로는 이더넷 64k 버퍼 기준으로 (소켓 수신버퍼는 64k 초과)

데탑에서 약간의 트래픽이 있는 상황에서 40k 언저리 쯤 부터 loss가 생기더라구요

점점 동시? 수신량이 많아지면 자연스레 loss 발생률도 올라가구요...

서버니깐 다른 트래픽이 좀 있는 상황에 이더넷 하나에 물려있다고 가정하고

현재 300+ 에 개 당 100 바이트라면 loss가 생길 수 있는 상황일거 같에요... (select까지 감안해서)

물론 거의? 동시에 확! 들어온다고 봤을때요;

그리고 제 생각으로는 현재 문제가 어느정도 주기적으로 발생한다면 네트웍 보단 서버가 버린다는 쪽에

의심을 두는게 맞지 않나 싶어요 UDP라고 하지만 네트웍 상태에서 패킷이 loss 되는 경우는 별로 본적이 없어서요;

trymp의 이미지


답해 주셔서 감사합니다.

말씀하신 부분에서 수신버퍼가 40k 정도이면 패킷누수가 발생할 수 있다고

하셨는데요. 서버에서 수신버퍼가 어느정도 찼는지를 확인 할 수 있는 방법이 있나요?

유틸을 사용해야 하는지 아니면 커널소스에서 printk()를 찍어야 하는지 알고 싶습니다.

알려주시면 정말 감사하겠습니다.

obbaya의 이미지

버퍼 확인보다는 패킷 손실만 확인하면 될거 같은데

핫빗이 실패한 후 netstat -su 찍어서 수신에러 필드에 나타나면

왔는데 서버가 버린것으로 증명이 될 거 같에요

udp packet loss 체크할 수 있는 좋은 툴이 있는지는 검색을 한번... (찾으시면 알려주세요;)

trymp의 이미지

bash-3.1# netstat -su
IcmpMsg:
InType0: 2
InType3: 119
InType5: 54
InType8: 221694
InType11: 23
OutType0: 221694
OutType3: 1447
OutType8: 2
OutType11: 12
Udp:
259537631 packets received
1386 packets to unknown port received.
120 packet receive errors
321944114 packets sent
RcvbufErrors: 120
UdpLite:
error parsing /proc/net/netstat: No such file or directory
bash-3.1#

위와 같다면 UDP packet을 receive 해서 데몬까지 가지도 못하고 커널 스택단에서 버린건가요?

120개 정도가 수신애러로 나오는데 이것은 어플리케이션이 select() 로 받지 못했다고 보는게 맞나요?

조언 부탁드립니다.

obbaya의 이미지

패킷을 버린 주체는 정확히 모르겠어요

제가 아는 범위에서는 패킷이 소켓의 수신버퍼에 복사되지 못했고(아마도 수신버퍼가 가득차서)

따라서 select()는 패킷이 왔는지 알 수 없는 상황이라고 생각되요

혹시 서버의 소켓생성을 디폴트로 하셨다면 소켓버퍼 크기를 한번 늘려보세요

trymp의 이미지

테스트 한 번 해 볼께요...

chadr의 이미지

UDP는 손실이 일어나는 경우가 여러군데서 일어날 수 있습니다. 클라이언트에서 서버로 오는 중간에
거쳐오는 라우터가 바쁜 경우 드랍이 발생 할 수 있습니다. 원래 UDP는 그런 용도로 쓰이도록 만들어져 있지 않습니다.

패킷을 반드시 받아야한다면 신뢰성이 보장되는 TCP를 쓰셔야합니다. UDP는 신뢰성을 보장하지 않습니다.
-------------------------------------------------------------------------------
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.

trymp의 이미지

bash-3.1# netstat -su
IcmpMsg:
InType0: 2
InType3: 119
InType5: 54
InType8: 221694
InType11: 23
OutType0: 221694
OutType3: 1447
OutType8: 2
OutType11: 12
Udp:
259537631 packets received
1386 packets to unknown port received.
120 packet receive errors
321944114 packets sent
RcvbufErrors: 120
UdpLite:
error parsing /proc/net/netstat: No such file or directory
bash-3.1#

위와 같다면 UDP packet을 receive 해서 데몬까지 가지도 못하고 커널 스택단에서 버린건가요?

120개 정도가 수신애러로 나오는데 이것은 어플리케이션이 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.