繁体   English   中英

关于InetAddress的“ isReachable”方法

[英]Regarding InetAddress “isReachable” method

为了开发设备监控系统,我使用了InetAdress isReachable方法来了解网络中的设备是否在线。我正在使用ScheduledExecutorService以及设备列表来同时对icmp设备进行ping操作。

现在,如果要由ScheduledExecutorService用10个线程池ping的设备数量很少(例如60台设备),则可以正常工作。平均结果将正确显示设备状态。此处isReachable的超时时间为5000毫秒。 如果将设备数量增加到80个,则即使设备处于联机状态,某些设备也会使用isReachable方法显示脱机状态。如果我将isReachable方法的超时时间增加到10000 ms,则设备状态可以更有机会获得正确的状态状态。

对于这些设备,大多数设备都是基于Linux的系统,并且isReachable始终会为它们返回正确的状态,但对于Windows,其行为是不可预测的。 我想确保网络上设备的状态始终正确。 通过启动Java进程来查看联机设备的退出值0,也可以有一种替代机制。

例如,“ Process proc = new ProcessBuilder("ping", host).start();

那么,有什么专家会建议? 具有isReachable Process的设备的检查状态是否会比isReachable调用更好,更可靠?

在子流程中运行ping不可能使情况变得更好。 虽然Java进程的负载将减少,但是您只是在一台机器上转移它。 (此外,由于ICMP ECHO(ping的标准核心)的工作方式,我不确定您是否真的可以一次从一台主机一次对多台计算机执行ping操作。)您可能遇到的另一个问题是一台机器可以响应ping而实际上无法有效地到达它; 我见过一些机器在运行内核(使其可ping通),但是没有正在运行的用户进程,并且您可以轻松地想象机器上特定的有趣服务正在关闭。 (此外,某些防火墙阻止ping。)使用与该机器上运行的真实服务的某种虚连接可以实际检测每台机器是否正常工作,这要好得多。

如果您真的想跟踪大量计算机的状态,则应考虑使用为该任务设计的软件(例如Nagios)。 对于ServerFault而言,这不仅仅是堆栈溢出的问题……

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM