我有一个项目,我在多个服务器上点击一堆自定义Windows性能计数器并将它们聚合到一个数据库中。如果服务器关闭,我想跳过它,继续我的一天。
目前,我正在检查服务器是否处于活动状态,通过在共享中执行DirectoryInfo
,我必须在此过程中稍后查看,然后检查.Exists
属性。这是我目前用于测试的代码段:
DirectoryInfo di = new DirectoryInfo(machine.Share_Path);
if (!di.Exists)
{
log.Warn("Could not access " + machine.Name + "! Maybe its down?");
continue; // Skips to the next server in my loop where this snippet exists.
}
这很有效,但速度很慢。 di.Exists位平均需要大约68秒来完成其工作,理想情况下我需要在一秒钟内知道服务器是否可访问。 Ping也不是一个选项,因为服务器可以ping通,但不能在我们的环境中“活动”。
我对.NET世界仍然很新鲜,所以我愿意接受人们可以提供的任何建议。
提前致谢。
-Weegee
答案 0 :(得分:8)
Ping先,稍后提问
为什么不先ping,然后再做di.Exists如果得到回应?
这样可以让您在无法访问的情况下提早失败,而不会浪费时间用于严重损坏的机器。
事实上,我之前已经成功使用过这种方法。<强> Paralellize 强>
另一个选择是对服务器上的检查和操作进行并列化,因为它们已知可用。
您可以使用Paralell.ForEach()
方法,并使用线程安全队列和简单的使用者线程来执行所需的操作。结合上面的检查方法,这可以缓解上/下检查的几乎所有瓶颈。
敲门
另一种方法是ckeck是否正在运行所需的远程服务(通过直接访问其端口或通过使用WMI查询它)。
由于WMI几乎总是在计算机启动时运行,因此您的连接应该非常快,无论是成功还是失败。
答案 1 :(得分:2)
我认为唯一的“快速”方式是在不依赖ping的情况下查看是否可以创建套接字,看看是否可以实际连接到您尝试访问的服务端口。
这相当于 telnet servername 135 以查看它是否已启动。
...具体
System.Net.Sockets.TcpClient
)Close()
取消连接。免责声明:我不知道这会对任何威胁/防火墙保护产生什么影响,可能会发现此类连接/断开连接没有数据发送活动为威胁。
答案 2 :(得分:1)
打开Socket到特定端口通常可以解决问题。如果你真的希望它快,请确保在新套接字(Nagle算法)上设置NoDelay属性,这样就没有缓冲。
Fast很大程度上取决于延迟,但这可能是我知道连接到端点的最快方式。使用异步方法并行化非常简单。您检查的速度在很大程度上取决于您的网络拓扑,但在测试1000台服务器(0-75ms之间的延迟)时,我已经能够在~30秒内获得连接状态。根本不是科学数据,但应该给你这个想法。
此外,不要通过UNC文件共享执行此操作,因为如果服务器不再存在,您将有很多悬空连接永远超时。因此,如果您有许多服务器具有无效的DNS记录并且您尝试轮询它们,那么随着时间的推移,您将完全关闭Windows。像File.Exists和任何文件访问之类的东西都会导致这种情况。
答案 3 :(得分:0)
“Full-Blown”选项是安装一个监控工具,如SCOM(System Center Operations Manager),它有一个SDK,可用于查询SCOM(性能)和维护信息avout机器被监控。可能会成为远方的桥梁......
Telnet是另一种选择。尝试远程登录目标计算机以查看它是否响应。
创建一个在目标计算机上安装的小型Windows服务,让sys管理员在对目标计算机执行维护时停止它(只需使用批处理文件来net stop / net启动服务)