0

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

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

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

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

}).bind(10001);

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

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

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

4

2 回答 2

1

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

于 2012-07-02T09:13:37.427 回答
0

I've bumped into a similar issue with statsd which also uses node.js udp. If you're running on linux, changing the receive buffers seems to improve things considerably to avoid drops.

Specifically, you can run something like

sudo sysctl -w net.core.rmem_default=20971520

see this statsd github issue for more info.

于 2013-07-31T05:49:03.990 回答