我尝试做的是使用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%的邮件。
任何人都有任何关于这里会发生什么的建议吗?显然这是一个非常简单的例子,但我在完整的代码中看到了相同的问题,所以原则应该是相同的。