네트워크 상에서 송신 패킷이 너무 많으면 못 받는 경우도 있나요?
글쓴이: trymp / 작성시간: 목, 2010/02/04 - 12:30오후
센터중앙에 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 도 수초내로 다시 살았다고 판단합니다.
논리적으로는 죽은 세션이 나오면 안되는데 왜 나오는지 모르겠습니다.
이 상황에 대해서 고수님들의 조언 부탁드립니다.
Forums:
UDP 면 버퍼상태에
UDP 면 버퍼상태에 따라서 loss가 생기는데요
제 경험으로는 이더넷 64k 버퍼 기준으로 (소켓 수신버퍼는 64k 초과)
데탑에서 약간의 트래픽이 있는 상황에서 40k 언저리 쯤 부터 loss가 생기더라구요
점점 동시? 수신량이 많아지면 자연스레 loss 발생률도 올라가구요...
서버니깐 다른 트래픽이 좀 있는 상황에 이더넷 하나에 물려있다고 가정하고
현재 300+ 에 개 당 100 바이트라면 loss가 생길 수 있는 상황일거 같에요... (select까지 감안해서)
물론 거의? 동시에 확! 들어온다고 봤을때요;
그리고 제 생각으로는 현재 문제가 어느정도 주기적으로 발생한다면 네트웍 보단 서버가 버린다는 쪽에
의심을 두는게 맞지 않나 싶어요 UDP라고 하지만 네트웍 상태에서 패킷이 loss 되는 경우는 별로 본적이 없어서요;
답변 주셔서 정말 감사합니다. ^^
답해 주셔서 감사합니다.
말씀하신 부분에서 수신버퍼가 40k 정도이면 패킷누수가 발생할 수 있다고
하셨는데요. 서버에서 수신버퍼가 어느정도 찼는지를 확인 할 수 있는 방법이 있나요?
유틸을 사용해야 하는지 아니면 커널소스에서 printk()를 찍어야 하는지 알고 싶습니다.
알려주시면 정말 감사하겠습니다.
버퍼 확인보다는
버퍼 확인보다는 패킷 손실만 확인하면 될거 같은데
핫빗이 실패한 후 netstat -su 찍어서 수신에러 필드에 나타나면
왔는데 서버가 버린것으로 증명이 될 거 같에요
udp packet loss 체크할 수 있는 좋은 툴이 있는지는 검색을 한번... (찾으시면 알려주세요;)
netstat 를 사용해서 본 제 서버 PC 정보입니다.
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() 로 받지 못했다고 보는게 맞나요?
조언 부탁드립니다.
패킷을 버린 주체는
패킷을 버린 주체는 정확히 모르겠어요
제가 아는 범위에서는 패킷이 소켓의 수신버퍼에 복사되지 못했고(아마도 수신버퍼가 가득차서)
따라서 select()는 패킷이 왔는지 알 수 없는 상황이라고 생각되요
혹시 서버의 소켓생성을 디폴트로 하셨다면 소켓버퍼 크기를 한번 늘려보세요
답변 주셔서 감사합니다. ^^
테스트 한 번 해 볼께요...
UDP는 손실이
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.
netstat 를 사용해서 본 제 서버 PC 정보입니다.
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() 로 받지 못했다고 보는게 맞나요?
조언 부탁드립니다.
댓글 달기