0

私がやろうとしているのは、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 のログ生成ツール) を使用して 1 秒あたり 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 によって送信される 1 秒あたりのログ数を 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の制限なのかを正直に調べてみましたが、実際にはそれらのいずれでもないようです。ノードがある時点で 1 秒あたり 30k 以上のメッセージを受信できる場合 (50% 以上を失っているにもかかわらず)、以前に送信された 5k の 100% を受信できないのはなぜですか? 送信されたメッセージの量に関係なく、メッセージの 50% 以上が失われているようです。

ここで何が起こっているのかについて何か提案はありますか? 明らかにこれは非常に単純な例ですが、コード全体で同じ問題が見られるため、原則はおそらく同じであるはずです。

4

0 に答える 0