Java SNMP构造函数需要几秒钟才能返回

Java SNMP构造函数需要几秒钟才能返回,java,snmp4j,Java,Snmp4j,我使用的是Snmp4j 2.2.3,当我通过公共Snmp(TransportMapping)构建org.Snmp4j.Snmp对象时,我观察到一个长达8秒的延迟,我想知道是否有人知道我应该把注意力集中在Snmp中的什么地方。我在Redhat Linux上看到了这种情况,但我没有看到从Windows XP设备上运行时的延迟 在以下代码中,第3行“Snmp=新的Snmp(传输);”最多冻结8秒 Address targetAddress = new UdpAddress(host + "/" + p

我使用的是Snmp4j 2.2.3,当我通过
公共Snmp(TransportMapping)
构建
org.Snmp4j.Snmp
对象时,我观察到一个长达8秒的延迟,我想知道是否有人知道我应该把注意力集中在Snmp中的什么地方。我在Redhat Linux上看到了这种情况,但我没有看到从Windows XP设备上运行时的延迟

在以下代码中,第3行“Snmp=新的Snmp(传输);”最多冻结8秒

Address targetAddress = new UdpAddress(host + "/" + port);
TransportMapping transport = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transport);

CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(targetAddress);
target.setRetries(2);
target.setTimeout(1500);
target.setVersion(SnmpConstants.version2c);
target.setMaxSizeRequestPDU(65535);

snmp.listen();

非常感谢,这很可能是操作系统的RedHat随机种子初始化中的问题。据我所知,操作系统有一个补丁可以确保熵计算不会花费太多时间。

我发现snmp4j 1.11.2也存在同样的问题。 将
-Djava.security.egd=file:/dev//uradom
添加到jvm解决了这个问题

找到了解决方案,并且正确地指出了问题所在

如果您只使用SNMPv2c,那么可以进行更干净的初始化,不加载v3的加密相关类

TransportMapping transport = new DefaultUdpTransportMapping();
MessageDispatcher disp = new MessageDispatcherImpl();
disp.addMessageProcessingModel(new MPv2c());
snmp = new Snmp(disp, transport);
...
snmp.listen();

我已经看到这个问题发生在作为虚拟机运行的red hat flavors上,因为无法访问硬件来为urandom生成熵。如果是这种情况,安装haveged可以解决问题。它是熵产生的另一个来源

如何设置haveged:

与haveged相关的安全帖子提到了熵产生的其他方法: