gpt4 book ai didi

java - Windows Server 2008 上的 MulticastSocket 问题

转载 作者:可可西里 更新时间:2023-11-01 12:41:53 26 4
gpt4 key购买 nike

我有一个 java 应用程序,它使用一些 MulticastSocket 实例来监听一些 UDP 多播提要。每个这样的套接字都由一个专用线程处理。
线程读取每个数据报,解析其内容并将数据包的序列 ID(长)和接收到数据报的时间戳写入日志 (log4j)。

当我尝试在 Windows Server 2008 R2 上运行同一应用程序的两个实例时,具有 2 * 6 个内核并比较 2 个应用程序创建的 2 个日志,我注意到数据包的时间经常不一样。

大多数数据包由 2 个应用程序同时接收 (milis),但频繁同一个数据包的接收时间之间有大约 1-7ms 的差异由 2 个应用程序。

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

没有观察到丢包问题,带宽问题的可能性不大。

欢迎提出想法/意见。谢谢。

最佳答案

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

这是来自著名 James Holmes article 的摘录关于 Java 中的计时 - 这可能是你的情况:

for Windows users, particularly on dual-core or multi-processor systems (and it seems most commonly on x64 AMD systems) if you see erratic timing behaviour either in Java, or other applications (games, multi-media presentations) on your system, then try adding the /usepmtimer switch in your boot.ini file.

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

关于java - Windows Server 2008 上的 MulticastSocket 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9193082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com