java - Windows Server 2008上的MulticastSocket问题

Bic*_*ick 10 java windows udp multicast windows-server-2008

我有一个java应用程序,它使用一些MulticastSocket实例来监听一些UDP多播源.每个这样的套接字由专用线程处理.
线程读取每个Datagram,解析它的内容并写入log(log4j)数据包的序列id(long)和接收数据报的时间戳.

当我尝试在Windows Server 2008 R2上运行相同应用程序的2个实例(具有2*6个内核)并比较2个应用程序创建的2个日志时,我注意到数据包的时间频繁不同.

大多数数据包同时由2个应用程序(milis)接收,但两个应用程序在同一数据包的接收时间之间经常存在大约1-7ms的差异.

我尝试在NIC中分配更多缓冲区,并使套接字读取缓冲区更大.此外,我尝试最小化GC运行,我也使用-verbose:gc,可以看到GC时间和有问题的时间差异不会同时发生.这允许我假设我的问题与GC无关.

没有观察到丢包问题,并且不太可能出现带宽问题.

欢迎提出意见/建议.谢谢.

Ole*_*eev 6

默认情况下,Windows计时器中断频率为100 Hz(每10ms 1个滴答).这意味着操作系统无法保证Java线程能够以更高的精度唤醒.

以下是詹姆斯·霍姆斯(James Holmes)一篇关于Java时序的文章的摘录- 可能是你的情况:

对于Windows用户,特别是在双核或多处理器系统上(在x64 AMD系统上最常见),如果您在Java或系统上的其他应用程序(游戏,多媒体演示)中看到不稳定的计时行为,然后尝试在boot.ini文件中添加/ usepmtimer开关.

PS:绝不是我在Windows性能优化领域可信,也是从Windows 2008开始支持HPET,但它与定时器中断频率的关系对我来说是一个谜.