2010-02-10 9 views
5

Stiamo osservando un comportamento strano e non siamo sicuri se si tratti di un problema con apache, php, mysql o il sistema operativo, quindi sui grandi cervelli di stackoverflow!I processi Apache/PHP si bloccano durante l'interazione con MySQL

Abbiamo Apache e mod_php che comunicano con un server mysql5. A volte, un processo sceglierà di bloccarsi, provando a leggere da un descrittore di file.

di accensione strace uno su di loro (tutti i processi che pendono hanno mostrato gli stessi risultati) ha dato questo:

[[email protected] ~]# strace -p 8450 
Process 8450 attached - interrupt to quit 
read(57, <unfinished ...> 

Allora cosa fu cercando di leggere?

[[email protected] ~]# lsof -p 8450 
... 
... 
httpd 8450 apache 57u IPv4 5546599    TCP 
prweb133v.local:36615->hadat.local:mysql (ESTABLISHED) 

Questo è il nostro server mysql! Ok, forse stava cercando di leggere i risultati di una query, ho pensato. Controllando la lista di processi sul server mysql, la connessione è stata stabilita ma in uno stato di SLEEP.

Hmmmm.

Quindi ho controllato netstat per vedere chi stava cercando di inviare/ricevere cosa.

Sul server web:

[[email protected] ~]# netstat -t -n -a | grep 36615 
tcp  0  5 172.23.179.6:36615   172.23.179.67:3306   
ESTABLISHED 

e sul server MySQL c'era una connessione stabilita, ma 0 nella trasmissione o la ricezione code.

Qualche idea di cosa potrebbero essere questi 5 byte misteriosi o perché non ottengono casualmente il server mysql?

Cheers!

Mike

+0

È possibile connettersi e interrogare il database da soli e/o da altre applicazioni? – jdizzle

+0

Sei sicuro che ciò avvenga in modo casuale e che non sia legato a uno script particolare? –

+0

Sono il collega di Mike; quando in questo stato di errore, è possibile aprire un browser più recente (ottenere una nuova sessione PHP) e utilizzare il sito come se nulla fosse accaduto, quindi il DB è ancora OK. Potrebbe essere legato a uno script incluso in tutte le pagine, ma è (finora) casuale per quanto riguarda la pagina visualizzata che attiva l'errore. – crb

risposta

1

Cosa mysql-motore stai usando (MyISAM, InnoDB, ...)? Usi l'interfaccia mysql o mysqli dal lato php?

Darei il "log" e "log_slow_queries" nel file di configurazione mysql un tentativo (possibilmente su un ramdisk) insieme con il guado attraverso l'output per "SHOW GLOBAL STATUS;" nella shell mysql (ogni variabile server che termina con "* _waits" o è connessa alla connessione).

È stata modificata qualsiasi parte nella sezione "Ottimizzazione fine" del file di configurazione mysql? Cambiato alcuni buffer?

Nel php.ini, si dispone di un valore predefinito (60) per mysql.connect_timeout? L'impostazione di "mysql.trace_mode" su "on" non farà male per un po '.

Si potrebbe anche voler sottoporre a stress-test, se possibile, diverse parti/URL della vostra app con uno strumento come "ab" per restringerlo.

Oppure: quando si utilizza apache con il modulo prefork, avviare localmente solo un server ("Startserver 1", "MaxSpareServers 0", qualcosa del genere) e stress test fino a quando non si blocca. Quindi i registri potrebbero avere più valore.

1

me Qualcuno e-MAILLED da questa pagina, così sono tornato al PO e ottenuto questo aggiornamento sulla eventuale correzione che abbiamo usato:

E 'stato un po', ma per quanto mi ricordo che questo era a causa di alcuni errori di rete tra il server Web e il server mysql.Siamo stati utilizzando connessioni persistenti, quindi la risorsa era ancora aperta da apache anche se da qualche parte lungo la rete la connessione era morta senza che nessun server ne fosse a conoscenza, penso che fosse dovuto a un firewall non configurato (o scritto) .

Abbiamo interrotto l'utilizzo di connessioni persistenti e il problema è andato via.

Problemi correlati