node.js UDP数据在高速率下丢失

时间:2012-07-02 08:55:59

标签: node.js udp

我观察到与node.js 0.6.18>的UDP连接上的重要数据丢失。和0.8.0。 它出现在每秒大约1200个数据包的高数据包速率下,帧数约为1500字节。 每个数据包都有一个递增的数字,因此很容易跟踪丢失的包的数量。

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

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

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

}).bind(10001);

在接收回调中,我测试了两个案例,我首先在一个文件中保存了5000个包。结果没有丢弃包。 在我包含数据处理程序并获得大约50%的丢弃率之后。我所期望的是过程数据例程应该是完全异步的 并且不应该向系统引入死区时间,因为它是一个简单的解析器来处理包中的二进制数据并将事件发送到进一步的处理例程。

解析例程似乎引入了事件处理程序无法处理每个数据包的死区时间。

在低封装率(<1200封装/秒)下,没有观察到数据丢失!这是一个错误还是我做错了什么?

2 个答案:

答案 0 :(得分:0)

Node.js作为单线程系统运行。当您正在进行处理时,您的进程无法接收数据,并且网络数据将排队,直到OS缓冲区已满,然后数据包将被丢弃。有许多方法可以解决这个问题,但通常您会有一组接收(和排队)数据的进程,而另一组进程将在不延迟接收进程的情况下进行处理。可能有很多模块可以帮助你设计这个,但我会把它留给专家......; - )

答案 1 :(得分:0)

我遇到了statsd的类似问题,它也使用了node.js udp。如果你在linux上运行,改变接收缓冲区似乎可以大大改善,以避免掉线。

具体来说,您可以运行类似

的内容

sudo sysctl -w net.core.rmem_default=20971520

请参阅this statsd github issue了解详情。