Perché Apache funziona in modo selvaggio e uccide MySQL?


8

Apache ha perso il controllo negli ultimi giorni e ha causato il crash di MySQL due volte. Tutto è iniziato quando ho migrato un sito Web WordPress sul quale contiene anche un forum phpBB.

Non ho molta esperienza nell'amministratore del server, quindi per me è stato molto difficile individuare la causa del problema. Quando ho notato che MySQL era inattivo, ho eseguito TOP e ho visto il mio picco di caricamento del sistema a 98,00. Il server esegue 10 V-HOSTS, ognuno dei quali riceve una buona quantità di traffico, quindi ovviamente vedevo in esecuzione molti processi apache-2.

Il carico elevato del server è continuato per 10 minuti e poi è tornato allo stato normale. Non ho visto un picco di traffico di rete a questo punto.

Sfortunatamente, la registrazione degli errori di MySQL è stata disabilitata (ora è riattivata), quindi non ne ho idea. Ma sono abbastanza sicuro che Apache stava consumando tutte le risorse, quindi l'ID del processo MySQL è stato ucciso.

Le mie domande sono:

La prossima volta che si verifica: come posso identificare la causa del picco di carico del sistema? Potrebbe essere uno script php che è impazzito? Potrebbe essere un attacco DDOS?

C'è un modo per riavviare automaticamente MySQL quando si blocca?

Ho installato ora htop. Potrebbe essere più utile di top?

Ecco le statistiche del mio server:

m1.xlarge (8 ECUs, 4 vCPUs, 15 GiB memory, 4 x 420 GiB Storage Capacity)
Ubuntu Server 12.04.3 LTS 

Sebbene i log fossero disabilitati, sarebbe d' dmesgaiuto?
Daniel W.

Risposte:


9

MySQL potrebbe non registrare ancora nulla, perché ciò che sta probabilmente accadendo è che viene ucciso senza tante cerimonie dal sistema a causa della pressione della memoria di sistema da parte dei bambini di Apache. Dovrebbe esserci una traccia di questo in / var / log / syslog.

MySQL dovrebbe tentare di riavviarsi in caso di arresto anomalo o terminazione forzata, ma se non è disponibile memoria sufficiente, non può farlo ... e questo secondo errore non è visto da mysqld_safe come un "arresto", ma piuttosto come un "rifiuto di inizio ", quindi non continuerà a provare. Il tentativo di riavvio non riuscito viene spesso interpretato erroneamente dagli amministratori come "arresto anomalo", poiché la natura dell'errore originale è nascosta dietro un messaggio facilmente trascurabile nel registro errori di MySQL:

mysqld_safe Number of processes running now: 0

Vedi InnoDB Crash Post Mortem per una circostanza che sospetto sia simile alla tua.

La risposta apparentemente semplice al "perché" è che tra Apache e MySQL, il carico che hai e le tue attuali configurazioni, non hai abbastanza memoria sulla macchina e c'è un punto di non ritorno relativo al carico del traffico che fa emergere questa condizione .

Apache serve ogni richiesta del browser simultanea da un processo figlio, quindi del numero di connessioni simultanee aumenta, il numero di figli aumenterà. Dovrai prima limitare questo valore nella configurazione di Apache in modo da poter capire cosa sta effettivamente causando l'aumento delle connessioni simultanee ... è semplicemente un picco di traffico pesante ma legittimo? Qualche tipo di negazione del servizio? Query DB che ritardano le richieste perché durano troppo a lungo? Qualcosa che necessita di ottimizzazione?

http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients

Limitare i processi simultanei di Apache dovrebbe aiutare a prevenire questo, ma per essere chiari, è ingenuo pensare che questa sia la soluzione completa, quindi non voglio implicarlo. Una volta che i processi sono limitati a un livello ragionevole o almeno più sicuro, è possibile procedere con l'identificazione di ciò che sta realmente accadendo. (Esistono altri controlli di limitazione su Apache, ma questa non è la mia area di competenza.)

La "best practice" è ovviamente quella di eseguire il database su hardware diverso in modo che l'applicazione non possa ucciderlo. Mentre sembra più efficiente, in superficie, "massimizzare l'utilizzo" di una macchina condividendola, questa è una falsa economia. La maggior parte della memoria utilizzata da MySQL, in un tipico carico di lavoro, viene allocata al momento dell'avvio e mantenuta per tutto il tempo in cui MySQL Server è in esecuzione. È probabile che le esigenze della CPU condividano le ore di punta per MySQL e Apache, poiché alla fine servono lo stesso carico. In realtà potresti stare meglio con due m1.large invece del singolo m1.xlarge, e il costo sarebbe lo stesso dal momento che quello più piccolo è esattamente la metà del prezzo di quello più grande ... anche se hai già pagato in anticipo per lo sconto aggiuntivo, questa modifica può essere effettuata .


Grazie per la tua risposta, è stato davvero utile. Ho controllato / ver / log / syslog e ho trovato le seguenti righe: 18 dic 15:48:38 ip-10-33-164-173 kernel: [29714591.071719] Memoria insufficiente: uccidi il processo 28369 (mysqld) segna 21 o sacrifica figlio 18 dic 15:48:38 kernel ip-10-33-164-173: [29714591.071753] Processo ucciso 28369 (mysqld) total-vm: 2520332kB, anon-rss: 335304kB, file-rss: 0kB Quindi pensi di limitare il l'impostazione di maxclients in apache è la soluzione migliore per evitare che ciò accada? Quale pensi che sarebbe un valore più sicuro?
Bob Flemming,

1
Suggerirei che limitare i client massimi sarebbe il modo migliore per iniziare il processo di comprensione delle circostanze che contribuiscono a qualunque valanga si stia verificando. Dovrai elaborare un valore più sicuro in base alle tue circostanze, alla quantità di memoria libera sul sistema e alla quantità tipica di memoria che usi i bambini di Apache. Troppo basso e le richieste inizieranno a eseguire il backup; troppo in alto e tu sei dove sei adesso. Quindi monitorare i processi generati e osservare la memoria libera e i registri del server.
Michael - sqlbot

1

Hai alcuni punti da controllare:

-Controlla il / var / log / messaggi: oomkiller può terminare il processo mysql se non c'è più memoria da usare. Controlla il ram con free -lm (senza cache)

-Se usi apache con prefork mpm: controlla il numero di processo. Se apache impila un numero importante di processi (durante un carico di lavoro pesante) con un collegamento a mysql, la latenza e la memoria utilizzate possono crescere rapidamente.

-Controllare il numero di thread avviati da mysql con uno stato globale di visualizzazione : thread_cached, thread_created e thread_running sono importanti per il controllo (thread_created dovrebbe essere vicino a 0).

-Controlla la ram usata da Mysql.


0

Puoi anche esaminare l'implementazione di cpuset e la prenotazione di risorse per mysql. Questo è il più vicino all'esecuzione di questi servizi su hardware diverso, offrendo comunque i vantaggi di mantenere un singolo server.

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.