我开发了一些基于JBoss + EJB的企业应用程序的一部分。我的模块需要处理大量的传入UDP数据包。我已经做了一些负载测试,看起来如果以11ms的间隔发送数据包,一切都很好,但是如果间隔为10ms,一些数据包将丢失。这在我看来很奇怪,但是我多次进行10/11ms间隔负载测试比较,结果总是相同的(10毫秒 - 一些“丢失”数据包,11毫秒 - 一切正常)。“Lost”UDP数据包(JBoss + DatagramSocket)
如果出现同步问题,我希望在11ms测试(至少丢失一个包或者至少有一个错误的计数器值)的情况下也可以看到它。 所以,如果它不是因为同步,那么可能DatagramSocket通过我接收数据包不能按预期方式工作。
我发现接收缓冲区大小(SO_RCVBUF)具有默认的57344值(可能是底层IO网络缓冲区相关)。我怀疑,也许当这个缓冲区满了,然后新的传入UDP数据报被拒绝。我试着将这个值设置得更高一些,但是我注意到如果夸大,缓冲区会返回到它的默认大小。如果它依赖于底层,我如何从JBoss级别找出某个OS /网卡的最大缓冲区大小?
它可能是由接收缓冲区大小引起的,或者可能是57344的值足够大以处理大多数情况?你有这种问题的经验吗?
DatagramSocket没有超时设置。我的UDP数据报包含大约70个字节的数据(没有包含数据报头的值)。
[编辑] 我必须使用UDP,因为我收到Cisco Netflow数据 - 它是网络设备用来发送一些流量统计信息的协议。另外,我对发送的字节格式没有影响(例如,我不能为数据包添加计数器等等)。预计不会处理所有数据包(有些数据报可能会丢失),但我希望我会处理大部分数据包。在10ms间隔测试期间,大约30%的数据包丢失。
缓慢的处理不太可能导致此问题。目前singleton组件在一个循环中持有对DatagramSocket调用接收方法的引用。收到数据包后,它将被传递到队列,并通过从池无状态组件中挑选出来进行处理。 “Facade”Singleton只负责接收数据包并将其传递给处理(它不会等待处理完成事件)。
由于提前, 彼得
为什么你需要UDP?我会使用TCP,直到你有一个分析表明一个需要去UDP的饱和层。另外,我使用UDP的经验是数据通常是重复的。 “这是目前的状态。”所以不要担心,如果你错过了这个数据包,因为另一个数据包即将推出! – corsiKa 2011-02-23 18:44:49
“缓慢的处理不太可能导致此问题。” - 我认为是这样,因为10毫秒很小,与螺纹量程相同。 – ChrisW 2011-02-23 19:22:00
10ms在不同的操作系统/处理器上可能会有所不同。你可以发送较少的数据,比如100ms吗? – 2011-02-23 19:29:00