我参与开发了一款基于JBoss+EJB的企业应用程序。我的模块需要处理大量的UDP数据包。我进行了一些负载测试,发现当发送11ms时间间隔的数据包时,一切都很正常,但是当发送10ms时间间隔的数据包时,有一些数据包会丢失。在我看来这相当奇怪,但我已经多次进行了10ms和11ms时间间隔的负载测试比较,结果总是一样的(10ms - 一些“丢失”的数据包,11ms - 一切正常)。
如果同步出了问题,我预计在11ms测试中也会有类似的情况(至少会丢失一个数据包,或者至少会有一个错误的计数器值)。因此,如果不是因为同步问题,那么也许我接收数据包的DatagramSocket没有按照预期工作。
我发现接收缓冲区大小(SO_RCVBUF)默认为57344(可能是基于底层IO网络缓冲区的依赖)。我怀疑,当该缓冲区满时,新到达的UDP数据报将被拒绝。我尝试将此值设置得更高,但我注意到如果我夸大其词,缓冲区会返回其默认大小。如果它是基于底层层的依赖,那么我如何从JBoss层找到特定操作系统/网络卡的最大缓冲区大小?
这是否可能是接收缓冲区大小引起的问题,或者57344的值已足够处理大多数情况?您是否有类似问题的经验?
我的DatagramSocket上没有设置超时。我的UDP数据报包含约70个字节的数据(不包括数据报头)。
[编辑] 我必须使用UDP,因为我接收Cisco Netflow数据 - 这是网络设备用于发送一些流量统计信息的协议。此外,我无法影响发送字节的格式(例如,我无法添加数据包计数器等)。不是所有数据包都会被处理(某些数据报可能会丢失),但我希望能够处理大部分数据包。在10ms时间间隔测试期间,约30%的数据包丢失。
很少有可能是慢速处理导致了这个问题。当前的单例组件持有对DatagramSocket的引用,在循环中调用receive方法。当接收到数据包时,它将被传递到队列,并由从池中选择的无状态组件进行处理。“Facade” Singleton只负责接收数据包并将其传递给处理(它不等待处理完成事件)。
谢谢, Piotr
如果同步出了问题,我预计在11ms测试中也会有类似的情况(至少会丢失一个数据包,或者至少会有一个错误的计数器值)。因此,如果不是因为同步问题,那么也许我接收数据包的DatagramSocket没有按照预期工作。
我发现接收缓冲区大小(SO_RCVBUF)默认为57344(可能是基于底层IO网络缓冲区的依赖)。我怀疑,当该缓冲区满时,新到达的UDP数据报将被拒绝。我尝试将此值设置得更高,但我注意到如果我夸大其词,缓冲区会返回其默认大小。如果它是基于底层层的依赖,那么我如何从JBoss层找到特定操作系统/网络卡的最大缓冲区大小?
这是否可能是接收缓冲区大小引起的问题,或者57344的值已足够处理大多数情况?您是否有类似问题的经验?
我的DatagramSocket上没有设置超时。我的UDP数据报包含约70个字节的数据(不包括数据报头)。
[编辑] 我必须使用UDP,因为我接收Cisco Netflow数据 - 这是网络设备用于发送一些流量统计信息的协议。此外,我无法影响发送字节的格式(例如,我无法添加数据包计数器等)。不是所有数据包都会被处理(某些数据报可能会丢失),但我希望能够处理大部分数据包。在10ms时间间隔测试期间,约30%的数据包丢失。
很少有可能是慢速处理导致了这个问题。当前的单例组件持有对DatagramSocket的引用,在循环中调用receive方法。当接收到数据包时,它将被传递到队列,并由从池中选择的无状态组件进行处理。“Facade” Singleton只负责接收数据包并将其传递给处理(它不等待处理完成事件)。
谢谢, Piotr