2015-07-01 10 views
7

Durante la lettura mongodb's documentation una delle cose che mi ha colpito è stato:Conseguenze dell'utilizzo di kill -9 per i processi del nodo?

ATTENZIONE:

Mai usare kill -9 (cioè SIGKILL) per terminare un'istanza mongod.

Ho riscontrato problemi durante l'utilizzo di foreman start per avviare il mio server di nodi. Foreman avvierà più processi di nodo con lo stesso PID.

Tuttavia, il problema è che quando si interrompe il processo del nodo, il nodo non si ferma effettivamente in esecuzione e continua a utilizzare la porta su cui era in ascolto.

Per risolvere questo problema, ho utilizzato sudo kill -9 <PID> per il processo del nodo che desidero terminare. Ci sono conseguenze negative per fare questo?

Inoltre, perché Mongo mette in guardia dall'usare kill -9 per terminare un'istanza mongod?

+1

* "Inoltre, perché Mongo mette in guardia contro l'utilizzo di kill -9 per terminare un'istanza mongod?" * La mia ipotesi sarebbe quella di evitare la perdita di dati. non vorrai uccidere il processo nel bel mezzo di una transazione. –

+0

Forse non sei abbastanza paziente usando un altro segnale –

risposta

5

Non dà il processo la possibilità di pulito:

1) arrestare le connessioni socket

2) Eliminare i file temporanei

3) informare i suoi figli che sta andando via

4) ripristinare le sue caratteristiche del terminale

Queste sono le cattive conseguenze di ciò che può accadere quando si utilizza kill -9. Dovresti usare solo kill -9 come ultima risorsa se tutto il resto ha fallito.

E alla seconda domanda, poiché kill -9 interromperà il processo anche se è nel mezzo di un'operazione mentre kill interromperà il processo dopo un'uscita pulita.

+0

Se dovessi usare '' 'kill -9''' c'è un modo per fare manualmente questi 4 passaggi? (chiudere connessioni socket, pulire i file temporanei, ecc.) –

+2

No, perché tali azioni dipendono dal codice del processo. Se lo uccidi, non può più essere fatto. Probabilmente puoi fare un po 'di lavoro manuale sfogliando '/ tmp', ma i socket sono finiti da tempo e i processi connessi hanno ricevuto un brutto errore in quel momento. –

2

Utilizzando SIGKILL() al posto dei più comuni SIGTERM (senza parametri) o SIGHUP (-1): il processo viene ucciso a livello di sistema operativo. Mongo conserva molti dati in memoria come cache, sia per la lettura che per la scrittura. L'utilizzo di SIGKILL potrebbe quindi significare che i dati sono stati scritti a metà su disco o non verranno mai scritti affatto. In entrambi i casi è possibile ottenere un database danneggiato o finire con la perdita dei dati comunicati agli utenti o ad altri processi come archiviati correttamente. I sistemi di database "classici" aggirano questo problema utilizzando i registri delle transazioni (un panico del kernel o interruzione di corrente è essenzialmente lo stesso effetto), ma Mongo è considerato "nosql" per buone ragioni, tra cui in particolare la mancanza di integrità transazionale.

Questo vale solo per il processo del server, ovviamente, è possibile uccidere i processi del nodo in qualsiasi modo si desideri dalla prospettiva di mongo. Tuttavia, in generale, è necessario evitare di utilizzare kill -9 per eliminare il processo qualsiasi, per gli stessi motivi illustrati sopra. I processi che non possono essere ripuliti tendono a lasciare un disastro. Il solito ordine è:

kill <pid> 

...Invia SIGTERM, chiedendo un arresto regolare, quindi attendere 30 secondi per il processo di chiudere, se è ancora vivo:

kill -1 <pid> 

... Invia SIGHUP, chiedendo l'arresto immediato, attendere altri 30 secondi almeno per il processo per chiudere, e infine:

kill -9 <pid> 

... Se, e solo se , il processo non può essere permesso di continuare l'esecuzione, perché sta causando problemi nella stabilità del server o le risorse di blocco. In tutti gli altri casi, aspetta.

Per le differenze tra arresto "normale" e "immediato" menzionato sopra, prendere in considerazione un numero notepad.exe in cui sono state digitate 2 righe. Grazioso apre una finestra di dialogo in cui si chiede se si desidera salvare, l'immediato si chiude semplicemente senza l'interazione dell'utente e "kill" interrompe immediatamente il processo e rilascia tutte le risorse di memoria e di altro tipo nel sistema. Storicamente i segnali provengono dai vecchi mainframe dial-in, dove SIGHUP è l'abbreviazione di "Hangup", a indicare che l'utente è rimasto e non può tornare.

Problemi correlati