O Ping é uma maneira confiável de verificar se um servidor está disponível?

96

No meu aplicativo, estou executando ping no servidor e aguardando uma resposta. Estou usando isso para determinar se o servidor está disponível e é responsivo ou não.

Essa é uma maneira confiável de determinar a disponibilidade? Presumo que um firewall possa filtrar o tráfego icmp ... Existem outras desvantagens? Existe um método mais confiável?

Peter Kelly
fonte

Respostas:

139

A melhor maneira de saber se um determinado serviço remoto está ativo é pedir que ele atenda a uma solicitação da maneira que deveria - na verdade, é a única maneira de realmente saber que algo está funcionando corretamente.

Como exemplo, eu sempre consigo que meus balanceadores de carga recebam uma resposta real dos nossos servidores Web, você pode fazer o mesmo para uma pequena seleção em uma caixa de banco de dados, se quiser, ou o que o servidor atual servir. Como uma dica, você pode criar um 'online.txt' (ou qualquer outro nome que você queira dar) em seus servidores da Web, peça aos seus LBs que tentem obter esse arquivo e, se falhar, removerão o servidor do VIP. uma ótima maneira de remover manualmente servidores individuais de seus VIPs simplesmente renomeando um único arquivo.

O ping apenas testa a capacidade de responder a pings, então esse é o SO básico, partes da pilha de IP e os links físicos - mas é tudo, todo o resto pode estar inativo e você não saberia.

Eu sei que isso é mencionado abaixo, mas vale a pena repetir uma e outra vez.

Solicitações de eco ICMP (também conhecidas como "Pings") (também conhecidas como ICMP Tipo 8) são construídas na especificação da pilha de IPs, sim, mas não precisam ser implementadas ou usadas. De fato, há um grande número de provedores de Internet que se recusam a encaminhar essas solicitações e ignoram silenciosamente essas solicitações, pois são uma forma de ataque à rede (chamada de pingflood).

Como mencionado acima, isso é tratado pelo sistema operacional (especificamente no nível da pilha de rede) e, portanto, cabe à configuração do sistema operacional responder a eles ou não. Se isso estiver desativado (uma precaução de segurança?), Você não poderá fazer nada para receber respostas de ping do outro lado. É por isso que não é confiável.

Chopper3
fonte
34
O que o homem disse! Eu sempre aconselhar os clientes que a melhor maneira de saber se um servidor está oferecendo serviço X é solicitar o serviço X .
MadHatter
5
Na verdade, criamos uma API RESTful de "teste" em nossos aplicativos apenas para isso. Então, nós sabemos que, se um aplicativo responde a blah / whatever_app / pulso cabe, atendendo a solicitações, e tem todas as ferramentas de que necessita (DB, dependências, etc.)
tsykoduk
5
Para adicionar ao MadHatter, geralmente é uma boa ideia fazer um ping e uma solicitação. Dessa forma, você pode saber imediatamente se está lidando com conectividade de rede ou com uma interrupção de serviço ... Uma delas tende a criar coisas completamente diferentes da outra.
user606723
Ping não é mesmo um teste confiável que o próprio servidor pode responder a de ping - se isso não acontecer, então tudo o que sei é que alguma coisa entre você e ele está filtrando o tráfego ICMP
Rob Moir
4
Supondo que a máquina responda ao ping em circunstâncias normais, você pode usá-lo como algum tipo de filtro bloom: Se o ping falhar, o serviço está definitivamente desativado (você tem um problema de rede, pois estabelecemos o ping normalmente). No entanto, se o ping for bem-sucedido, o serviço ainda poderá estar inativo, conforme descrito nesta resposta
3Doubloons
10

Na maioria das vezes, sim, no entanto:

  • alguns servidores bloqueiam solicitações de ping

  • só porque o servidor está respondendo não significa automaticamente que o site (ou qualquer outro serviço que você espere usar) esteja funcionando , verifique também se a resposta corresponde ao conteúdo esperado.

picos selvagens
fonte
5

É verdade que, em muitas ocasiões, o tráfego ICMP é filtrado para que não seja confiável ...

Talvez uma maneira melhor seria telnetar o servidor na porta de serviço em que você está interessado.

ou seja, telnet 127.0.0.1 8080

sdmythos_gr
fonte
5

Se o servidor precisar responder apenas aos pings, esse é um bom método para determinar sua disponibilidade. Se for necessário fornecer, por exemplo, um serviço da Web, você deverá executar algum tipo de teste para verificar se está funcionando de maneira semelhante para serviços de arquivos etc.

user9517
fonte
3

o ping tem 2 desvantagens:

  • o ping envia icmp, que pode ser filtrado pelo firewall
  • a porta tcp ou udp que seu aplicativo usa pode estar ocupada ou não aberta - o ping não verifica se

uma solução melhor é verificar sua porta udp / tcp diretamente, para ver se o serviço ainda está disponível ... :-)

JMW
fonte
3

Existem ferramentas especiais para teste e monitoramento como o Nagios / Icinga .
Com essas ferramentas, você pode (é claro) fazer verificações com vários testes de ping, mas também verificar seus serviços.

Todas as verificações podem usar o valor retornado para classificar o resultado como "bom", "aviso" e "crítico" e podem ser escritas em quase todas as linguagens de programação.

É claro que não é fácil de configurar (como apontar e clicar), mas personalizável, confiável e extensível. Funciona bem em várias distribuições Linux e Unix.

ppuschmann
fonte
2

Teste os serviços que você está procurando, apenas executar ping em um servidor não significa que os serviços estão funcionando.

Por exemplo:

Imagine um servidor web com uma dúzia de sites, então eu preciso saber se o site está ativo, criei um pequeno script em php e o executo a cada 10 minutos.

O script faz o seguinte ->

<?php
    $website1 = "http://www.mywebsite.com/";
    $myWebsite = file_get_contents($website1);
    $message = 'My website' . $website1 . ' is DOWN at the moment.';
    if (empty($myWebsite)) mail('[email protected]', 'Website is DOWN', $message);
?>
deepcell
fonte
2

Usar o ping para determinar se um servidor está disponível é como um médico de emergência verificando se um paciente está respirando. Sim, é um bom lugar para começar, mas pode haver outros problemas.

Adão
fonte
1

Nós usamos pingpara fazer uma pré-verificação, que o anfitrião é ligado e acessível, antes de lançar o nosso serviço systemd que tenta uma conexão ssh a ele. Isso economiza tempo na depuração, pois o systemctl startcomando falhará imediatamente, em vez de silenciosamente falhar e se perder na selva journalctl.

Observe que o ping não é "confiável" no mesmo sentido que o TCP. Se você tiver uma conexão ruim (ou uma pilha de rede de baixa qualidade, obrigado Intel mpss ) e os pacotes estiverem sendo descartados, um único ping de pacote poderá falhar. Por outro lado, uma conexão TCP é confiável contra pacotes descartados. Portanto, ironicamente, uma conexão ssh pode funcionar imediatamente após uma única ping falha . Portanto, se você usar o ping para fazer uma verificação de sanidade, não deixe de permitir alguma falha.

Mark Lakata
fonte
0

Apenas meus dois centavos: Temos um aplicativo herdado que usa esse método e tivemos que atendê-lo porque o ping não era suficiente para determinar a disponibilidade do serviço.

Ping apenas mostra que o servidor é capaz de escutar, mas, no nosso caso, o serviço não pôde iniciar sem intervenção humana.

Como resultado, as unidades, que assumiram ingenuamente que o servidor estava disponível, estavam tentando se conectar e atingir o tempo limite. Em vez de exibir a mensagem "O servidor não está disponível".

-

Nosso aplicativo atual, que se comunica via XMLHTTPRequests com um servidor web, envia uma mensagem formada à qual o servidor responderá com um código de status. O código de status é calculado pelo servidor fazendo uma série de verificações para garantir que vários subsistemas estejam online (banco de dados, os diretórios necessários podem ser gravados etc.)

Robbie
fonte
0

Se, em circunstâncias normais, o servidor responder ao ping, é útil executá-lo em intervalos de um minuto para verificar se ele responde. Obviamente, isso indica apenas que existe um servidor nesse endereço IP e que existe um caminho de rede da origem do ping até o destino. Definir um limite para o tempo de resposta pode permitir que você também monitore o estado da rede. Se você estiver executando ping em um servidor na Internet, pouco poderá fazer para corrigir a rede, mas se um cliente ligar para reclamar, você já estará ciente do problema. Além disso, executar ping no google.com também é útil. Se você e o Google estão fora do ar, algo está acontecendo.

Como outros já mencionaram, é importante monitorar se o serviço que você está fornecendo está respondendo e se o desempenho está bom. Ou seja, você pode querer verificar por que uma era da web que geralmente responde em um segundo agora está respondendo. Eu tenho 10 segundos.

Portanto, saber que um serviço não está respondendo e está com falha no ping fornece muito mais informações do que apenas uma abordagem. Além disso, se você monitorar os processos também, sabendo que o ping responde, o serviço não responde e o servidor da Web não possui o número correto de processos informando onde procurar primeiro.

Você pode enlouquecer com o monitoramento, apenas monitore o suficiente para dizer quando algo ruim aconteceu ou está se tornando perigoso. Ou seja, muita troca,> 90% de uso do disco, alto disco io, 100% da CPU por longos períodos e lembre-se de que o monitoramento é apenas um ataque de negação de serviço realizado muito lentamente.

Stuart Woodward
fonte
0

O Ping (Packet Internet Groper) informa se o seu sistema está se comunicando com o sistema com o qual você deseja estabelecer conexão pela rede. Até pings, não significa que o serviço, por exemplo, o serviço RemoteRegistry esteja em execução.

No entanto, para corrigir qualquer problema, o ping é necessário. Você pode corrigir remotamente qualquer problema. Portanto, o ping tem sua própria importância.

sairam
fonte
-3

A melhor maneira de usar meus scripts é

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

no lugar de rsh alternativas como remsh podem ser usadas. Isso garante que seu sistema remoto seja inicializado completamente e você possa executar comandos nele. O ping simples não é suficiente, pois durante a inicialização, quando os serviços de rede são iniciados, o sistema começa a responder ao ping.

Amol Sale
fonte
3
rsh? Realmente? Por que não usar ssh?
Joachim Sauer
5
rshvs à sshparte, como a capacidade de executar date(supondo que você seja, para começar) diz algo sobre se um servidor Web, servidor SMTP, servidor DNS, servidor de banco de dados local ou não está em execução e pode atender a solicitações? É melhor solicitar o serviço específico do qual você deseja verificar a disponibilidade (que pode ser um shell remoto, mas com certeza não precisa ser).
um CVn
-3

Ao reiniciar um servidor Windows, abro uma caixa de prompt de comando e insiro

ping <box> -t

Primeiro, ele sugere que está disponível - essa é a caixa que está caindo. Então você terá muitos "pedidos de tempo limite". Quando você começa a receber replies, a caixa está aberta.

Dave
fonte
7
Isso não significa que esteja disponível para realizar um trabalho real, apenas que esteja respondendo ao ping.
user9517
Talvez. É sempre possível que eu possa fazer logon no servidor e isso é tudo que eu preciso.
Dave
É perfeitamente possível que um servidor esteja respondendo ao ping, mas não (ainda, nem mesmo) inicie quaisquer funções de rede de nível superior. A única coisa que o ping testa é o ping. E talvez resolução de nomes se você executar ping pelo nome, em vez de IP
Rob Moir
Já tive muitas ocasiões em que um servidor respondeu a pings, mas falhou ao servidor de qualquer outro tipo de solicitação, incluindo logons. Um ping pode ser um meio muito grosseiro de dizer quando o servidor começou a voltar, mas isso é tudo. Obviamente, isso pressupõe que o servidor até responda a pings.
John Gardeniers