我有一个java应用程序,它使用一些MulticastSocket实例来监听 一些UDP多播源。每个这样的套接字都由专用线程处理 线程读取每个数据报,解析它的内容并写入日志(log4j)数据包的序列ID(长)和接收数据报的时间戳。
当我尝试在Windows Server 2008 R2上运行同一应用程序的2个实例时, 使用2 * 6核心并比较2个应用程序创建的2个日志, 我注意到数据包的时间频繁不一样。
大多数数据包同时由两个应用程序(milis)接收,但经常收到 在相同分组的接收时间之间存在大约1-7ms差异的差异 通过2个应用程序。
我尝试在NIC中分配更多缓冲区,并且还使套接字读取缓冲区更大。 此外,我尝试最小化GC运行,我也使用-verbose:gc,可以看到 GC时间和有问题的时间差异不会同时发生。 这使我可以假设我的问题与GC无关。
没有观察到丢包问题,并且不太可能出现带宽问题。
欢迎提出意见/意见。 感谢。
答案 0 :(得分:6)
默认情况下,Windows计时器中断频率为100 Hz(每10ms 1个刻度)。这意味着操作系统无法保证Java线程能够以更高的精度唤醒。
这是一篇关于Java时间突出James Holmes article的摘录 - 可能是你的情况:
PS:绝不是我在Windows性能优化领域可信,也是从Windows 2008开始支持HPET,但它与定时器中断频率的关系对我来说是一个谜。对于Windows用户,特别是在双核或多处理器系统上(在x64 AMD系统上最常见),如果您在Java或其他应用程序(游戏,多媒体演示文稿)中看到不稳定的计时行为你的系统,然后尝试在boot.ini文件中添加/ usepmtimer开关。
答案 1 :(得分:0)