udp통신에 대한 문의
글쓴이: darkman76 / 작성시간: 일, 2015/05/31 - 1:41오전
udp통신에 대해서 문의드립니다.
제가 1초당 정보를 송/수신 하고 있으며 패킷 사이즈는 15byte 됩니다.
클라이언트 갯수는 1000개 정도 됩니다.
근데 1초당 정보이면 1,2,3,4,5,6,7,8,9,10 이렇게 데이터가 나와야 하는데 1,3,4,8,10 이렇게 불규칙적으로 나오더군요
그래서 보내는쪽 패킷과 받는쪽 패킷을 봤더니 보내는 쪽은 정확히 보내는데 받는쪽에서 중간중간 15byte의 한 패킷이 싹 다 손실이 되서
받지 못하더군요 이런 경험 해보신분 있으신지요?
100개 정도의 크라이언트는 이 증상이 적은데 갯수가 많아 질수록 심해집니다.
그렇다면 하나의 udp 쓰레드와 포트로 통신하던거를 한 10개로 하면 더 좋아질지 아니면 아예 속도를 포기하고 tcp/ip로 가야 할지 답답하네요
tcp/ip로 쓰레드를 천개를 만든다는것이 불가능한게 이미 하나의 프로세스에서 현장 장비에 tcp/ip로 1000개를 만들어서 tcp/ip로 통신하고 있고
수집된 정보를 내부 서버끼리 udp통신을 하고 있는 중입니다.
경험 많으신 분들 답변좀 부탁드립니다.
Forums:
클라이언트가 1000개면 초당 1000개정도의 패킷을
클라이언트가 1000개면 초당 1000개정도의 패킷을 수신하는거죠? 하나를 처리하는데 들어가는 동안 나머지 패킷들이 쌓이게 되고, 그 쌓인 패킷이 버퍼에 가득차게 되면 그 다음 패킷부터는 유실됩니다.
이 정도로 처리를 해주셔야할 것 같네요. 목표는 처리 속도를 지연시킬만한 것을 모두 제거하고, 버퍼에 쌓이는 양을 최소화하는 것 입니다.
1. 처리를 지연시킬만한 것을 제거하기 위해 수신하는 쓰레드에서 불필요한 I/O를 최대한 줄입니다. 수신 쓰레드와 처리하는 쓰레드를 분리하는 것도 좋은 방법입니다.
(파일 로그를 남긴다든지, 다른 소켓에 전달한다든지, 동기화 객체를 기다린다든지..)
2. 버퍼에서 하나만 읽지 말고 읽을 수 있는 한 모두 읽습니다. 읽기가 다 끝나면 처리하지 말고 일단 다 읽어 들입니다.
(get_sockopt이 SO_NREAD를 이용해서 남은게 있는지 확인하는 방법등을 이용해서...)
3. 수신 버퍼의 크기를 키웁니다. set_sockopt, SO_RCVBUF를 이용하면됩니다.
행운을...
---
http://coolengineer.com
댓글 달기