我正在尝试做的是使用 nodejs 通过 UDP 摄取大量日志。我最终编写了一些不错的代码来处理所有这些。但是,我在测试时似乎丢失了很多通过 UDP 发送的消息。
下面的简单代码将说明我的问题:
var dgram = require("dgram")
, udp = dgram.createSocket('udp4')
, connections = 0
udp.on('message', function(msg){
connections++
})
setInterval(function(){
console.log(connections + ' msg per sec incoming')
connections = 0
},1000);
udp.bind(514)
我在这里所做的只是创建套接字并绑定到 514。我使用 loggen(Linux 上的日志生成工具)每秒发送 5k 日志,我的控制台如下所示:
2404 msg per sec incoming
2409 msg per sec incoming
2001 msg per sec incoming
2409 msg per sec incoming
2696 msg per sec incoming
2650 msg per sec incoming
但是,然后我将 loggen 每秒发送的日志增加到 70k,我的控制台如下所示:
30738 msg per sec incoming
32284 msg per sec incoming
35104 msg per sec incoming
34998 msg per sec incoming
34441 msg per sec incoming
33890 msg per sec incoming
老实说,我试图弄清楚这是 nodejs 限制还是 UDP 限制或 NIC 限制,但实际上它似乎不是其中的任何一个。如果 Node 可以在某一时刻每秒接收 30k+ 条消息(尽管它丢失了超过 50%),为什么它不能接收到之前发送的 5k 条消息的 100%?无论发送多少消息,它似乎都丢失了超过 50% 的消息。
有人对这里可能发生的事情有任何建议吗?显然这是一个非常简单的示例,但我在完整代码中看到了相同的问题,因此原则应该是相同的。