2012-07-02 2 views
0

node.js가 0.6.18> 및 0.8.0 인 UDP 연결에서 중요한 데이터 손실을 목격했습니다. 초당 약 1200 패킷의 높은 패킷 속도에서 프레임이 약 1500 바이트 제한으로 나타납니다. 각 데이터 패키지에는 증가하는 숫자가 있으므로 잃어버린 패키지 수를 추적하기 쉽습니다.node.js UDP 데이터가 높은 패키지 속도로 손실 됨

var server = dgram.createSocket("udp4"); 

server.on("message", function (message, rinfo) { 

     //~processData(message);   
     //~ writeData(message, null, 5000); 

}).bind(10001); 

수신 콜백에서 나는 두 개의 사례를 테스트하여 파일에 5000 개의 패키지를 저장했습니다. 결과 도자기가 떨어지지 않았습니다. 데이터 처리 루틴을 포함하고 약 50 % 드롭 율을 얻은 후에. 예상했던대로 프로세스 데이터 루틴은 완전히 비동기 적이어야하며 패키지에 바이너리 데이터를 처리하고 추가 처리 루틴에 이벤트를 방출하는 간단한 파서이기 때문에 시스템에 데드 타임을 발생 시켜서는 안됩니다.

파싱 루틴은 이벤트 처리기가 각 패킷을 처리 할 수없는 데드 타임을 초래하는 것으로 보입니다.

낮은 패키지 속도 (< 1200 패키지/초)에서 데이터 손실이 없습니다! 이 버그입니까 아니면 내가 잘못하고있는 것입니까?

답변

0

Node.js는 단일 스레드 시스템으로 실행됩니다. 프로세스를 처리하는 동안 프로세스는 데이터를받을 수 없으며 OS 버퍼가 꽉 차고 패킷이 떨어질 때까지 네트워크 데이터가 대기열에 있습니다. 이를 처리 할 수있는 방법은 여러 가지가 있지만 일반적으로 데이터를 수신하고 대기열에 넣는 한 세트의 프로세스가 있고 다른 프로세스 세트는 수신 프로세스를 지연시키지 않고 처리를 수행합니다. 이 모듈을 구성하는 데 도움이되는 모듈이 많이 있지만 전문가에게 맡기 겠습니다 ...-)

+0

감사의 마리우스! udp raw 소켓에 액세스하여 버퍼 길이를 늘릴 방법이 없습니다. – python357

+0

@koleto @koleto https://github.com/lloyd/node-compute-cluster를 사용하여 CPU 집약적 인 작업을 메인 이벤트 루프에서 쉽게 내릴 수 있습니다. – penartur

+0

@penartur 사용할 수 있습니까? EventEmitter가 마스터와 작업자간에 메시지를 전달합니까? – python357

0

statsd과 비슷한 문제가 발생했으며 node.js udp도 사용합니다. 당신이 리눅스에서 실행중인 경우, 수신 버퍼를 변경하면 상당히 떨어지는 것을 피하기 위해 일을 상당히 향상시키는 것처럼 보입니다.

특히,

sudo sysctl -w net.core.rmem_default=20971520

더 많은 정보를 원하시면 this statsd github issue를 참조

처럼 뭔가를 실행할 수 있습니다.