Apache zaman aşımlarında hata ayıklama nasıl yapılır?


14

Kullanarak bir Apache 2.2 sunucusunda (Ubuntu Server 10.04, 8x2GHz, 12Gb RAM) bir PHP web uygulaması çalıştırıyorum prefork. Her gün Apache yaklaşık 100k-200k istek alır, bu yaklaşık 100-200 zaman aşımı sınırına ulaşır (yani her binde bir), hemen hemen tüm diğer istekler zaman aşımının çok altında sunulur.

Bunun neden olduğunu öğrenmek için ne yapabilirim? Yoksa tüm isteklerin zaman aşımına uğraması normal mi?

Şimdiye kadar yaptığım şey bu:

Yanıt süresi ister

Görüldüğü gibi, zaman aşımı sınırı ile daha makul istek arasında çok az istek var. Şu anda zaman aşımı sınırı 50 saniyeye ayarlanmış, daha önce 300'e ayarlanmıştı ve hala bazı zaman aşımları ve aynı zamanda diğer isteklere kadar büyük bir boşluk ile aynı durumdaydı.

Zaman aşımına uğrayan tüm istekler AJAXisteklerdir, ancak o zaman bunların büyük çoğunluğu öyledir, bu yüzden belki de bu bir tesadüfdür. Apache dönüş kodu 200, ancak zaman aşımı sınırına açıkça ulaşıldı. Çok çeşitli IP'lerden geliyorlar.

Zaman aşımına uğrayan isteklere baktım ve onlar hakkında özel bir şey yok, aynı istekleri yaparsam bir saniyeden daha kısa sürede geçerler.

Sebebi bulabileceğimi görmek için farklı kaynaklara bakmaya çalıştım ama şansım yok. Her zaman bol miktarda boş bellek vardır (minimum yaklaşık 3GB boştur), yük bazen 1.4'e ve CPU kullanımı% 40'a kadar çıkar, ancak yük ve CPU kullanımı düşük olduğunda zaman aşımlarının çoğu gerçekleşir. Disk yazma / okuma gün boyunca hemen hemen sabittir. MySQL yavaş sorgu günlüğünde (1 saniyenin üzerindeki herhangi bir şeyi günlüğe kaydetmek için ayarlanmış) giriş yok, hiçbir istek birçok veritabanının yazdığı / okuduğu bir istek kullanmıyor.

Sistem yükü / işlemci ile yanıt süresi isteyin

Mavi,% 40'lık pik yapan CPU kullanımıdır, bordo 1.4'lük pik ile yüklenir. Bu nedenle, düşük CPU kullanımı / yükü ile bile zaman aşımları aldığımızı görebiliriz (on saniyelik artış CPU kullanımına iyi karşılık gelir, ancak bu başka bir sorundur, bunlara neyin neden olabileceğini bulma umudum daha yüksektir).

Apache hata günlüğünde hata yok ve 200'den fazla aktif Apache işlemine ulaştığını görmedim.

Sunucu Ayarları:

Timeout 50 
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2

<IfModule mpm_prefork_module>
    ServerLimit     350
    StartServers        20
    MinSpareServers     75
    MaxSpareServers     150
    MaxClients          320
    MaxRequestsPerChild 5000
</IfModule>

Güncelleme:

Ubuntu 12.04.1'e güncelledim, her ihtimale karşı, değişiklik yok. Mod_reqtimeout'u ayarlarla ekledim:

RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500

Şimdi neredeyse tüm zaman aşımları 10 saniyede, 20 saniyede bir veya iki gerçekleşir. Bunu, çoğu zaman almak için sorunlu istek gövdesini aldığını ifade etmek için mi alıyorum? İstek gövdesi asla birkaç yüz bayttan büyük olmamalıdır. Ağ trafiğini 1 saniyede izledim ve asla 1Mbit / s'den daha yüksek olmuyor ve sunucunun 1Gbit / s hattında olduğunu düşünmüyorum, herhangi bir rxerrs veya rxdorps görmüyorum HopelessN00b hakkında yayınladı. Bu sadece bazı kötü kullanıcı bağlantılarının durumu olabilir mi?

Her saatte ani yükselmeler için (biraz sürükleniyor gibi görünüyorlar, yukarıdaki grafiklerde saati 33 dakika geçiyorlar, şimdi 12 dakika geçmişler), periyodik olarak çalışan bir şey olup olmadığını görmeye çalıştım ( vb) ancak hiçbir şey bulamadı. PHP çöp toplama her saatte iki kez çalışır, ancak ani anda değil, yine de devre dışı bırakmayı denedim ama hiçbir fark yaratmıyor.

Ben spikes sırasında süreçlere bakmak için - top-cpu ve üst ile dstat kullandım ve ortaya çıkan tüm apache birkaç saniye için çok çalışıyor ama başka hiçbir işlem önemli cpu kullanıyor.

Dikenlerin yakınlaştırılmış bir grafiğini yaptım: Yakınlaştırılmış istek yanıt süresi

Bana göre apache birkaç saniye durur ve durma sırasında gelen istekleri işlemek için çok çalışır. Böyle bir durmaya ne sebep olabilir veya yanlış mı yorumluyorum?


1
İstekler üzerinde bazı grafikler göndermek istedim, ancak temsilcim çok düşük.
Leon

Yanıtlar:


4

İlk grafiğinize baktığımda, ilk dikkat ettiğim şey, soruna katkıda bulunabilecek saatlik bir yavaşlama (saatin yaklaşık 40 dakikasını geçiyor) gibi görünüyor. OS / veritabanındaki görev zamanlayıcılarına bir göz atmalısınız.

Sağladığınız verilere dayanarak, bir sonraki adımım yanıt sürelerinin sıklığına (Y eksenindeki yanıt sayısı ile X'deki süreye) bakmak, ancak yalnızca zaman aşımını gösteren URL'leri (veya her seferinde bir URL'yi) incelemek olacaktır. ). Tipik bir sistemde bu normal veya poisson dağılımını takip etmelidir - zaman aşımı talepleri sadece kuyruğun bir parçası olabilir - bu durumda çabalarınızı genel ayarlamaya odaklamanız gerekir. Eğer dağıtım bi-modal ise OTOH, kodunuzda bir yerde çekişme aramanız gerekir.


Yanıtınız için teşekkürler. Saatlik yavaşlamalara neyin sebep olabileceğini araştırıyorum. Bu arada zaten sahip olduğum verilerin bir frekans grafiğini yaptım. Bu, zaman aşımı sorunu olan URL'lerden yalnızca biridir (ancak diğerleri çok benzer görünüyor): leela.kikora.no/apache_hist_show.png Zaman aşımı miktarı, 10 saniyeden daha kısa süren URL'lere kıyasla çok az, ancak görünüyor sanki kuyruğun bir parçası olmayabilir. Ancak öte yandan, 50+ saniye sürecek herhangi bir şeyi temsil ettiklerinden, böyle görünmesi gerekiyor olabilir.
Leon

3

Günde çok sayıda istek almanıza ve yalnızca yoğun saatlerde (yayınladığınız resimlerden) zaman aşımlarına sahip olduğunuz gerçeğine dayanarak başka bir düşüncem var.

Sunucu Hatası blogunda bir yayın varPer Second Measurements Don't Cut It ... Bu isteklerin bazıları ServerFault ekibinin karşılaştığı sorunla aynı şekilde çalışıyor mu?

1 Gbit / s arayüzlerde paketleri sık sık performansımızı zedeleyen sadece 10-30 MBit / s hızında attığımızı keşfettik. Bunun nedeni, 10-30 MBit / s hızının gerçekten 5 dakikada bir aktarılan bit sayısı bir saniyeye dönüştürülmesidir. Wireshark ile daha yakından kazdığımızda ve bir milisaniyelik IO grafiği kullandığımızda, sık sık 1 Gbit / s arayüzlerin milisaniye hızı başına 1 Mbit patlayacağımızı gördük.


İlginç, bir göz atacağım. Mod_reqtimeout'u etkinleştirdim ve RequestReadTimeout üstbilgisi = 20-40, minrate = 500 ve RequestReadTimeout body = 10, minrate = 500 olarak ayarladım ve hemen hemen tüm zaman aşımları 10 saniyede gerçekleşiyor. Bunu, istek gövdesinin çok uzun sürdüğü anlamına gelir (gövde hiçbir zaman en fazla birkaç yüz bayttan fazla olmamalıdır), bu yüzden ya bazı kullanıcılarımın kötü bağlantıları var ya da söylediğiniz gibi sunucumun tarafında tıkanıklık var.
Leon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.