Ping是检查服务器是否可用的可靠方法吗?


96

在我的应用程序中,我对服务器进行ping操作并等待响应。我正在使用它来确定服务器是否可用并且是否响应。

这是确定可用性的可靠方法吗?我认为防火墙可能正在过滤icmp流量...还有其他缺点吗?有没有更可靠的方法?

Answers:


139

判断给定远程服务是否存在的最佳方法是要求它按其应有的方式为请求提供服务-实际上,这是真正知道某项工作正常的唯一方法。

举例来说,我总是让负载均衡器从Web服务器获得实际的“正面”响应,如果需要,您可以对数据库框中的一小部分内容进行选择,或者使用实际的服务器服务。作为提示,您可以在Web服务器上创建一个“ online.txt”(或您想要给它提供的任何名称),让LB尝试获取该文件,如果失败,则将其从VIP中删除,这是仅通过重命名单个文件的一种手动将单个服务器从VIP中取出的好方法。

Ping仅测试对ping作出响应的能力,因此这是基础操作系统,IP堆栈的一部分以及物理链接-但这就是所有其他情况都可能发生的故障,您不知道。

我知道下面会提到这一点,但是它需要一次又一次地重复。

ICMP回显请求(也称为“ Pings”)(也称为ICMP类型8)是建立在IP堆栈规范上的,是的,但不需要实现或使用。实际上,由于它们是一种网络攻击形式(称为pingflood),因此有大量的Internet提供商拒绝转发这些请求并以静默方式丢弃这些请求。

如上所述,这是由OS处理的(特别是在网络堆栈级别),因此要由OS配置来响应或不响应。如果将其关闭(是否出于安全预防措施?),那么您将无法接收来自另一端的ping回复。这就是为什么它不可靠的原因。


34
那人说什么!我总是建议客户,最好的办法判断一个服务器是目前提供的服务,X是对请求服务X
MadHatter

5
实际上,我们建立一个“测试”的RESTful API集成到我们的应用程序只是这一点。因此,我们知道,如果某个应用程序响应blah / whatever_app / pulse,它就会启动,处理请求并拥有所需的所有工具(数据库,依赖关系等)
tsykoduk 2011年

5
要添加到MadHatter中,执行ping和请求通常是个好主意。这样一来,您可以立即知道您是要处理网络连接还是服务中断...哪一种趋向于创建与另一种完全不同的事物。
user606723 2011年

Ping甚至不是服务器本身可以响应ping的可靠测试-如果不是,那么您所知道的只是您和它之间的某些内容正在过滤ICMP流量
Rob Moir11年

4
假设机器在正常情况下对ping作出响应,则可以将ping用作某种布隆过滤器:如果ping失败,则服务肯定已关闭(由于我们通常已建立ping正常工作,所以您遇到了网络问题)。但是,如果ping成功,则该服务可能仍会按照此答案中所述的方式关闭
3Doubloons 2011年

10

大多数时候,是的,但是:

  • 一些服务器阻止ping请求

  • 仅仅因为服务器响应并不自动意味着网站(或您希望使用的任何服务)正在运行,还应该检查响应是否与预期内容匹配。


5

确实,在很多情况下,ICMP流量都会被过滤掉,因此可能不可靠...

更好的方法可能是在您感兴趣的服务端口上远程登录服务器。

即telnet 127.0.0.1 8080


5

如果仅要求服务器响应ping,则这是确定其可用性的好方法。如果要求提供例如Web服务,那么您应该进行某种形式的测试,以查看文件服务等是否同样起作用。


3

ping有2个缺点:

  • ping发送icmp,可被防火墙过滤
  • 您的应用程序使用的tcp或udp端口可能繁忙或无法打开-ping不检查

更好的解决方案是直接检查您的udp / tcp端口,以查看该服务是否仍然可用... :-)


3

有专门的测试和监视工具,例如Nagios / Icinga
使用这些工具,您可以(当然)可以通过各种ping测试进行检查,还可以对服务进行检查。

所有检查都可以使用返回的值将结果分类为“好”,“警告”和“关键”,并且几乎可以用每种编程语言编写。

当然,设置起来并不容易(例如单击即可),但是可定制,可靠且可扩展。在各种Linux和Unix发行版上都能很好地运行。


2

测试您要寻找的服务,仅对服务器执行ping操作并不意味着这些服务正在运行。

例如:

想象一下一个有十几个网站的网络服务器,然后我需要知道这些网站是否已启动,我用php做了一个小脚本,每10分钟运行一次。

该脚本执行以下操作->

<?php
    $website1 = "http://www.mywebsite.com/";
    $myWebsite = file_get_contents($website1);
    $message = 'My website' . $website1 . ' is DOWN at the moment.';
    if (empty($myWebsite)) mail('mail@server.com', 'Website is DOWN', $message);
?>

2

使用ping来确定服务器是否可用就像急诊医生检查病人是否在呼吸。是的,这是一个不错的起点,但是可能还有其他问题。


1

我们用ping做预检,该主机上电和到达,启动,试图一个ssh连接到它我们systemd服务之前。这样可以节省一些调试时间,因为该systemctl start命令将立即失败,而不是无提示地失败并在journalctl丛林中迷路。

请注意,在与TCP相同的意义上,ping不“可靠”。如果您的连接不良(或糟糕的网络堆栈,谢谢Intel mpss)并且数据包被丢弃,则单个数据包ping可能会失败。另一方面,TCP连接对于丢失的数据包是可靠的。因此,具有讽刺意味的是,一次失败后,ssh连接可能立即起作用。因此,如果您使用ping进行完整性检查,请确保允许某些故障。ping


0

只是我的两分钱:我们使用这个方法的遗留应用程序,并有为其服务,因为平安是不是足以确定服务的可用性。

Ping仅显示服务器具有侦听能力,但在我们的案例中,如果没有人工干预,该服务将无法启动。

结果,一些天真的认为服务器可用的单元正在尝试建立连接并超时。而不是显示“服务器不可用”消息。

-

我们当前的应用程序通过XMLHTTPRequests与Web服务器进行通信,它发送一条格式正确的消息,服务器将使用状态码进行响应。服务器通过进行大量检查来计算状态码,以确保各种子系统在线(数据库,必要的目录可写等)。


0

如果在正常情况下,您的服务器对ping作出响应,则每隔一分钟对ping一次以检查其是否响应非常有用。当然,这只会告诉您在该IP地址上有一台服务器,并且存在从ping的源到目标的网络路径。设置响应时间阈值还可以使您监视网络状态。如果您要ping Internet上的服务器,则可能无法修复网络,但是如果客户打电话投诉,您将已经意识到问题所在。另外ping google.com也很有用。如果您和Google都倒闭,则说明正在发生某些情况。

正如其他人提到的那样,监视提供的服务是否正在响应以及其性能是否正常非常重要。也就是说,您可能想检查为什么通常在一秒钟内响应的网络时代现在响应我只有10秒钟。

因此,知道一种服务没有响应并且正在ping失败将为您提供更多信息,而不仅仅是一种方法。另外,如果您也监视进程,知道ping响应,则服务不会响应,并且Web服务器的进程数不正确,这将告诉您首先要查找的位置。

您可能会因监视而发疯,因此只需监视足以告诉您什么时候发生了坏事或正在变得危险。也就是说,交换过多,磁盘使用率超过90%,磁盘io占用过多,CPU长时间处于100%状态,请记住,监视只是对服务进行的拒绝攻击,执行速度非常慢。


0

Ping(Packet Internet Groper)使您知道系统是否正在与要与之建立网络连接的系统通信。它甚至可以Ping,并不表示该服务(例如RemoteRegistry服务正在运行)。

但是,要解决任何问题ping是必需的。您可以远程解决任何问题。因此,ping具有其自身的重要性。


-3

我在脚本中使用的最好方法是

#rsh servername.com "date"
Mon Sep 19 04:42:20 PDT 2011

可以使用诸如remsh之类的rsh替代方法。这样可以确保远程系统完全启动,并且可以在其上运行命令。简单的ping是不够的,因为在启动过程中启动网络服务时,系统开始响应ping。


3
rsh?真?为什么不使用它ssh呢?
约阿希姆·绍尔

5
rshssh暂且不谈,如何执行date(假设您是这样),是关于Web服务器,SMTP服务器,DNS服务器,本地数据库服务器或诸如此类的东西正在运行并能够处理请求的事情?最好是实际询问您要验证其可用性的特定服务(它可能是远程外壳,但不一定一定要提供)。
的CVn

-3

当我重新启动Windows Server时,我打开命令提示符框并输入

ping <box> -t

首先,它将提示它可用-那就是盒子了。然后,您将获得很多“请求超时”。当您开始收到答复时,该框就会显示出来。


7
这并不意味着它可以用于实际工作,而只是在响应ping。
2011年

也许。我总是可以登录到服务器,这就是我所需要的。
戴夫

服务器完全有可能响应ping但尚未(甚至,甚至根本没有)启动任何更高级别的网络功能。ping测试唯一的是ping。如果是按名称而不是IP进行ping,则可能是名称解析
Rob Moir11

我曾有很多次服务器响应ping但无法处理任何其他类型的请求(包括登录)的情况。ping是告诉服务器何时开始恢复的非常粗略的手段,仅此而已。当然,这是假设服务器甚至对ping做出响应。
约翰·加迪尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.