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:
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 AJAX
isteklerdir, 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.
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:
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?