Ping è un modo affidabile per verificare se un server è disponibile?


96

Nella mia applicazione eseguo il ping di un server e aspetto una risposta. Sto usando questo per determinare se il server è disponibile e reattivo o meno.

È un modo affidabile per determinare la disponibilità? Presumo che un firewall potrebbe filtrare il traffico icmp ... Ci sono altri svantaggi? Esiste un metodo più affidabile?

Risposte:


139

Il modo migliore per sapere se un determinato servizio remoto è attivo è chiedergli di soddisfare una richiesta nel modo in cui è destinato - in realtà è l'unico modo per sapere veramente che qualcosa funziona correttamente.

Ad esempio, chiedo sempre ai miei sistemi di bilanciamento del carico di ottenere una risposta "head" effettiva dai nostri server Web, se lo si desidera, è possibile fare lo stesso con una piccola selezione su una casella DB o su qualunque cosa serva il proprio server. Come suggerimento puoi creare un 'online.txt' (o qualunque nome tu voglia dargli) sui tuoi server web, fare in modo che i tuoi LB provino a ottenere quel file e se fallisce rimuove il server dal VIP, questo è un bel modo per estrarre manualmente i singoli server dai tuoi VIP semplicemente rinominando un singolo file.

Il ping verifica solo la capacità di rispondere ai ping, quindi si tratta di un sistema operativo di base, parti dello stack IP e collegamenti fisici - ma tutto qui, tutto il resto potrebbe essere inattivo e non lo sapresti.

So che questo è menzionato di seguito, ma vale la pena ripetere ancora e ancora.

ICMP Echo Requests (aka "Pings") (aka ICMP Type 8) sono integrati nelle specifiche dello stack IP, sì, ma non devono essere implementati o utilizzati. È un dato di fatto, ci sono un gran numero di fornitori di servizi Internet che si rifiutano di inoltrare quelle e di abbandonare silenziosamente quelle richieste, in quanto sono una forma di attacco di rete (chiamato pingflood).

Come accennato in precedenza, questo è gestito dal sistema operativo (in particolare a livello di stack di rete) e quindi spetta alla configurazione del sistema operativo rispondere a questi o meno. Se questa opzione è disattivata (una precauzione di sicurezza?), Non puoi fare nulla per ricevere risposte ping dall'altra parte. Questo è il motivo per cui non è affidabile.


34
Quello che ha detto l'uomo! Consiglio sempre i clienti che il modo migliore per capire se un server è attualmente offre il servizio X è quello di richiedere il servizio X .
MadHatter,

5
Realmente realizziamo un'API RESTful "test" nelle nostre app proprio per questo. Quindi sappiamo che se un'app risponde a blah / whatever_app / pulse è
attiva

5
Per aggiungere a MadHatter, è spesso una buona idea fare un ping e una richiesta. In questo modo puoi sapere subito se hai a che fare con la connettività di rete o un'interruzione del servizio ... O uno tende a creare cose completamente diverse dall'altro.
user606723

Il ping non è nemmeno un test affidabile del fatto che il server stesso possa rispondere al ping - in caso contrario, tutto ciò che sai è che qualcosa tra di te e sta filtrando il traffico ICMP
Rob Moir

4
Supponendo che la macchina risponda al ping in circostanze normali, è possibile utilizzare il ping come una sorta di filtro bloom: se il ping ha esito negativo, il servizio è decisamente inattivo (si verifica un problema di rete, dal momento che il ping funziona normalmente). Tuttavia, se il ping ha esito positivo, il servizio potrebbe comunque essere disattivato come descritto in questa risposta
3Doubloons

10

Il più delle volte, sì, comunque:

  • alcuni server bloccano le richieste di ping

  • solo perché il server risponde non significa automaticamente che il sito Web (o qualunque servizio ti aspetti di utilizzare) funzioni , dovresti anche verificare se la risposta corrisponde ai contenuti previsti.


5

È vero che in molte occasioni il traffico ICMP viene filtrato in modo che possa essere inaffidabile ...

Un modo migliore forse potrebbe essere quello di telnetare il server sulla porta di servizio che ti interessa.

cioè telnet 127.0.0.1 8080


5

Se il server deve solo rispondere ai ping, questo è un buon metodo per determinare la sua disponibilità. Se è richiesto, ad esempio, di fornire un servizio Web, è necessario eseguire una qualche forma di test per vedere se funziona in modo simile per i file service ecc.


3

ping ha 2 inconvenienti:

  • ping invia icmp, che può essere filtrato dal firewall
  • la porta tcp o udp utilizzata dall'applicazione potrebbe essere occupata o non aperta - ping non lo verifica

una soluzione migliore è controllare direttamente la tua porta udp / tcp, per vedere se il servizio è ancora disponibile ... :-)


3

Esistono strumenti speciali per test e monitoraggio come Nagios / Icinga .
Con questi strumenti puoi (ovviamente) fare controlli con vari ping-test ma anche fare controlli sui tuoi servizi.

Tutti i controlli possono utilizzare il valore restituito per classificare il risultato come "buono", "avviso" e "critico" e possono essere scritti in quasi tutti i linguaggi di programmazione.

Naturalmente non è facile da configurare (come punta e clicca), ma personalizzabile, affidabile ed estensibile. Funziona bene su varie distribuzioni Linux e Unix.


2

Prova i servizi che stai cercando, solo il ping di un server non significa che i servizi stiano funzionando.

Per esempio:

Immagina un server web con una dozzina di siti Web, quindi ho bisogno di sapere se i siti Web sono attivi, mi sono fatto un piccolo script in php ed eseguo ogni 10 minuti.

Lo script fa il seguente ->

<?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

L'uso del ping per determinare se un server è disponibile è come un medico ER che controlla se un paziente sta respirando. Sì, è un buon punto di partenza, ma potrebbero esserci altri problemi.


1

Noi usiamo pingper fare un controllo preliminare, che l'host è acceso e raggiungibile, prima di lanciare il nostro servizio di systemd che tenta una connessione ssh ad esso. Ciò consente di risparmiare un po 'di tempo nel debug, poiché il systemctl startcomando fallirà immediatamente, invece di fallire silenziosamente e perdersi nella giungla journalctl.

Si noti che il ping non è "affidabile" nello stesso senso di TCP. Se si dispone di una connessione errata (o di uno stack di rete scadente, grazie a Intel mpss ) e i pacchetti vengono eliminati, un ping a pacchetto singolo potrebbe non riuscire. D'altra parte, una connessione TCP è affidabile contro i pacchetti rilasciati. Quindi, ironia della sorte, una connessione ssh potrebbe funzionare immediatamente dopo un singolo ping errore . Pertanto, se si utilizza il ping per eseguire un controllo di integrità, assicurarsi di consentire alcuni errori.


0

Solo i miei due centesimi: abbiamo un'applicazione legacy che utilizza questo metodo e abbiamo dovuto servirlo perché il ping non era sufficiente per determinare la disponibilità del servizio.

Ping mostra semplicemente che il server è in grado di ascoltare, ma nel nostro caso il servizio non è stato in grado di avviarsi senza l'intervento umano.

Di conseguenza, le unità, che asserivano ingenuamente che il server fosse disponibile, stavano tentando di connettersi e timeout. Invece di visualizzare il nostro messaggio "Il server non è disponibile".

-

La nostra attuale applicazione, che comunica tramite XMLHTTPRequests a un server Web, invia un messaggio formato a cui il server risponderà con un codice di stato. Il codice di stato viene calcolato dal server facendo una serie di controlli per garantire che vari sottosistemi siano online (DB, directory necessarie sono scrivibili, ecc.)


0

Se in circostanze normali il server risponde al ping, è utile eseguire il ping a intervalli di un minuto per verificare se risponde. Questo ovviamente ti dice solo che esiste un server a quell'indirizzo IP e che esiste un percorso di rete dalla sorgente del ping alla destinazione. L'impostazione di una soglia per il tempo di risposta può consentire di monitorare anche lo stato della rete. Se stai eseguendo il ping di un server su Internet, potrebbe esserci poco da fare per riparare la rete, ma se un cliente chiama per lamentarsi, sarai già consapevole del problema. Anche il ping google.com è utile. Se tu e Google siete entrambi a terra, sta succedendo qualcosa.

Come altri hanno già detto, è importante monitorare che il servizio fornito stia rispondendo e che le sue prestazioni siano OK. Vale a dire che potresti voler controllare perché un'era web che di solito risponde in un secondo ora sta rispondendo sono 10 secondi.

Quindi sapere che un servizio non risponde e che il ping non riesce ti dà molte più informazioni di un solo approccio. Inoltre, se si monitorano anche i processi, sapendo che il ping risponde, il servizio non risponde e il server Web non ha il numero corretto di processi che indica dove cercare prima.

Puoi impazzire con il monitoraggio, quindi basta monitorare abbastanza per dirti quando è successo qualcosa di brutto o sta diventando pericoloso. Vale a dire uno scambio eccessivo,> 90% di utilizzo del disco, disco alto, 100% CPU per periodi prolungati e ricordare che il monitoraggio è solo un attacco denial of service effettuato molto lentamente.


0

Ping (Packet Internet Groper) ti consente di sapere se il tuo sistema sta comunicando con il sistema con cui desideri stabilire una connessione in rete. Esegue anche il ping, non significa che il servizio, ad esempio, il servizio RemoteRegistry sia in esecuzione.

Tuttavia, per risolvere qualsiasi problema è necessario il ping. Puoi risolvere in remoto qualsiasi problema. Quindi, il ping ha la sua importanza.


-3

Il modo migliore che uso nei miei script è

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

al posto di rsh si possono usare alternative come remsh. Ciò garantisce che il sistema remoto sia avviato completamente e che sia possibile eseguire comandi su di esso. Il ping semplice non è sufficiente poiché durante l'avvio quando vengono avviati i servizi di rete, il sistema inizia a rispondere al ping.


3
rsh? Veramente? Perché non usare sshinvece?
Joachim Sauer,

5
rshvs a sshparte, come può essere in grado di eseguire date(supponendo che tu sia, per cominciare) qualcosa sul fatto che un server Web, un server SMTP, un server DNS, un server di database locale o cosa non è in esecuzione e in grado di soddisfare le richieste? Meglio chiedere effettivamente il servizio specifico di cui si desidera verificare la disponibilità (che potrebbe essere una shell remota, ma sicuramente non lo è).
un CVn

-3

Quando riavvio un server Windows, apro una finestra del prompt dei comandi e invio

ping <box> -t

Per prima cosa suggerirà che è disponibile, questa è la casella che scende. Quindi avrai un sacco di "timeout della richiesta". Quando inizi a ricevere risposte, la casella è aperta.


7
Ciò non significa che sia disponibile per svolgere un vero lavoro, ma solo che risponde al ping.
utente9517

Può essere. È sempre possibile accedere al server ed è tutto ciò di cui ho bisogno.
Dave,

È perfettamente possibile che un server risponda al ping ma non (ancora, o addirittura) abbia avviato funzioni di rete di livello superiore. L'unica cosa che il ping test è il ping. E forse la risoluzione dei nomi se esegui il ping per nome anziché per IP
Rob Moir,

Ho avuto molte occasioni in cui un server ha risposto ai ping ma non è riuscito a server qualsiasi altro tipo di richiesta, inclusi gli accessi. Un ping può essere un mezzo molto grezzo per dire quando il server ha iniziato a tornare indietro, ma questo è tutto. Ovviamente ciò presuppone che il server risponda anche ai ping.
John Gardeniers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.