MySQL ile etkileşim sırasında asılı Apache / PHP süreçleri

2 Cevap php

Biz bazı garip davranışları görüyoruz ve biz apache, php, mysql veya işletim sistemi ile ilgili bir sorun olmadığından emin değiliz, bu yüzden stackoverflow ve büyük beyinleri üzerinde!

Biz Apache ve bir MySQL5 sunucuya konuşuyor mod_php. Bazen, bir süreç bir dosya tanımlayıcı okumak için çalışırken, asmak için seçecektir.

Bunların üzerine strace'i biri kadar ateş verdi (tüm asılı süreçler aynı sonuçları gösterdi):

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

Bu yüzden okumaya çalışıyorum neydi?

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

Bu bizim mysql server var! Tamam, belki o bir sorgunun sonuçlarını okumaya çalışıyordum, diye düşündüm. Mysql sunucuda PROCESSLIST denetleme, bağlantı ama UYKU bir devlet kurulmuştur.

Hmmmm.

Öyleyse ben ne göndermek / almak için çalışıyor kim olduğunu görmek için netstat kontrol etti.

Web sunucusu üzerinde:

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

ve mysql sunucuda gönderme veya alma sıralarında 0 ancak kurulan bir bağlantı vardı.

Bu gizemli 5 bayt ne olabilir herhangi bir fikir, ya da neden rastgele mysql sunucuyu alamadım?

Şerefe!

Mikrofon

2 Cevap

Ne mysql-motoru (MyISAM, InnoDB, ...) kullanıyorsunuz? Eğer php tarafında mysql veya mysqli arabirimini kullanıyor musunuz?

Ben için çıktı yalak patkalar birlikte (muhtemelen bir ramdisk'in için) bir deneyin dosyası mysql config "log" ve "log_slow_queries" verecekti "GÖSTER GLOBAL Durum;" mysql kabuk ("* _waits" ile biten ya da her sunucu değişkeni ile ilgili bağlantısı).

Eğer mysql yapılandırma dosyasının "İnce ayar" bölümünde herhangi bir bölümünü değişmiş var mı? Bazı tamponlar değişti?

Php.ini olarak, mysql.connect_timeout için varsayılan bir değer (60) var mı? "On" için "mysql.trace_mode" Ayarı bir süre için zarar vermez.

Için "ab" gibi bir araç ile app mümkün, farklı parçalar / URL'ler daraltmak durumunda da, stres testi isteyebilirsiniz.

Veya: prefork modülü ile apache kullanırken kilitleniyor kadar, yalnızca yerel bir sunucu ("StartServers 1", "MaxSpareServers 0", böyle bir şey) ve stres testini başlatmak. Sonra günlükleri daha değerli olabilir.

Birisi bu sayfadan bana e-mailled, bu yüzden geri OP gitti ve biz kullanılan nihai düzeltme üzerinde bu güncelleme var:

It's been a while, but as far as I remember this was due to some network error between the web server and the mysql server. We were using persistent connections, so the resource was still held open by apache although somewhere along the network the connection had died without either server being aware of it, I think that was due to a poorly configured (or written) firewall.

Biz kalıcı bağlantıları kullanarak durdurdu ve sorun gitti.