2010-02-10 9 views
5

Obserwujemy dziwne zachowanie i nie jesteśmy pewni, czy to problem z apache, php, mysql lub systemem operacyjnym, a więc do wielkich mózgów stackoverflow!Procesy Apache/PHP zawieszają się podczas interakcji z MySQL

Mamy Apache i mod_php rozmawiające z serwerem mysql5. Czasami proces będzie się zawieszał, próbując odczytać z deskryptora pliku.

rozpalania strace na jedną z nich (wszystkie procesy wiszące pokazał te same wyniki) dało to:

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

Więc co ona próbuje odczytać?

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

To nasz serwer mysql! Ok, więc może próbował odczytać wyniki zapytania, pomyślałem. Sprawdzając listę procesów na serwerze mysql, połączenie zostało ustanowione, ale w stanie SLEEP.

Hmmmm.

Tak więc sprawdziłem netstat, aby zobaczyć, kto próbował wysłać/odebrać co.

Na serwerze internetowym:

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

i na serwerze mysql nie było nawiązane połączenie ale 0 w wysyłaniu lub odbieraniu kolejki.

Jakieś pojęcie o tym, czym mogą być te tajemnicze 5 bajtów lub dlaczego losowo nie dostają serwera mysql?

Pozdrawiam!

Mike

+0

Czy można połączyć się z bazą danych samodzielnie i/lub z innych aplikacji? – jdizzle

+0

Czy jesteś pewien, że dzieje się to losowo i że nie jest powiązane z konkretnym skryptem? –

+0

Jestem kolegą Mike'a; kiedy znajdujesz się w stanie awaryjnym, możesz otworzyć nowszą przeglądarkę (uzyskać nową sesję PHP) i korzystać z witryny tak, jakby nic się nie stało, więc DB jest nadal w porządku. Może być powiązany ze skryptem zawartym na wszystkich stronach, ale jest (jak na razie) losowy na jaką stronę, którą przeglądasz, uruchamia błąd. – crb

Odpowiedz

1

Co mysql-silnik używasz (MyISAM, innodb, ...)? Czy korzystasz z mysql lub interfejsu mysqli po stronie php?

Chciałbym dać "log" i "log_slow_queries" w pliku konfiguracyjnym mysql i spróbować (ewentualnie do ramdysku) wraz z brodząc przez wyjście dla "SHOW GLOBAL STATUS;" w powłoce mysql (każda zmienna serwera, która kończy się na "* _waits" lub jest związana z połączeniem).

Czy zmieniłeś jakąś część w sekcji "Dostrajanie" pliku konfiguracyjnego mysql? Zmieniono niektóre bufory?

W pliku php.ini masz domyślną wartość (60) dla mysql.connect_timeout? Ustawienie "mysql.trace_mode" na "on" nie zaszkodzi na chwilę.

Możesz także przetestować, jeśli to możliwe, różne części/adresy URL swojej aplikacji za pomocą narzędzia takiego jak "ab", aby je zawęzić.

Lub: Podczas korzystania z apache z modułem prefork, lokalnie uruchom tylko jeden serwer ("Startservers 1", "MaxSpareServers 0", coś w tym stylu) i test warunków skrajnych, aż się zawiesi. Wtedy dzienniki mogą mieć większą wartość.

1

Ktoś e-mailled mnie z tej strony, więc wróciłem do PO i dostał tę aktualizację na ewentualne poprawki użyliśmy:

To było trochę czasu, ale o ile pamiętam to było ze względu na błąd sieciowy między serwerem WWW a serwerem mysql. Byliśmy przy użyciu trwałych połączeń, więc zasób był nadal otwarty przez apache, chociaż gdzieś w sieci połączenie zginęło bez żadnego z nich świadomy serwer, myślę, że było to spowodowane słabo skonfigurowaną (lub zapisaną) zaporą sieciową .

Zatrzymaliśmy się przy użyciu trwałych połączeń, a problem zniknął.

Powiązane problemy