Apache MaxClients'a ulaşıyor ve sunucuyu kilitliyor


9

Şu anda 512M gerçek / 1024M burstable RAM (takas yok) ile bir OpenVZ VPS ile mpm-preforkve mod_phpüzerinde çalışan bir Apache2 sunucum var . Bazı testleri yaptıktan sonra, Apache'nin aldığı maksimum işlem boyutunun 23M olduğunu buldum, bu yüzden MaxClients25'e ayarladım (23M x 25 = 575 MB, benim için tamam). Sunucumda bazı yük testleri yapmaya karar verdim ve sonuçlar beni şaşırttı.

Ben kullanıyorum abbir wordpress blogdan ana sayfayı isteyen masaüstü makinede.

Ben çalıştırdığınızda ab24 eşzamanlı bağlantı ile, her şey yolunda görünüyor. Tabii, CPU artar, boş RAM düşer ve sonuç istek başına yaklaşık 2-3 saniye tepki süresidir.

Ancak ab25 eşzamanlı bağlantıyla (sunucu sınırım) çalışırsam , Apache birkaç saniye sonra takılır. İstekleri işlemeye başlar, ardından yanıt vermeyi durdurur, CPU% 100 boşta kalır ve abzaman aşımına uğrar . Apache günlüğüne ulaşıldığını söylüyor MaxClients.

Bu olduğunda, Apache 25 çalışan işlemle kilitli kalmaya devam eder (sunucu durumunu kontrol edersem hepsi "W" 'dadır) ve ancak TimeOutayarlardan sonra süreçler ölmeye başlar ve sunucu tekrar yanıt vermeye başlar (benim durumumda ayarlanır) 45).

Benim sorum: beklenen davranış bu mu? Apache neden ulaştığında neden ölüyor MaxClients? 24 bağlantı ile çalışıyorsa, 25 ile çalışmamalı, her bir talebi yanıtlamak ve geri kalanları kuyruğa almak için daha fazla zaman ayırabilir mi?

Çalışan herhangi bir çocuğun absadece sunuculara eşzamanlı bağlantıları ayarlayarak bir web sunucusunu öldürebileceği garip geliyor MaxClients.

Yanıtlar:


17

HA! Sonunda problemi kendim buldum. Bu, sunucu yöneticisinden daha programlama ile ilgilidir, ancak yine de cevabı buraya koymaya karar verdim çünkü google'ı arayarak bu tür bir sorunu olan tek kişi olmadığımı buldum (ve Apache askıda kaldığından, ilk tahmin bir sorun olduğudur. sunucu ile).

Sorun Apache ile değil, Wordpress'imle ilgili. Daha spesifik olarak temamla. Lightworld adlı bir tema kullanıyorum ve blog başlığına resim eklemeyi destekliyor. Buna izin vermek için PHP'nin fonksiyonunu kullanarak görüntü boyutunu kontrol eder getimagesize(). Bu işlev, görüntüyü almak için sunucuya başka bir http bağlantısı açtığından, her istek abPHP'den dahili olarak başka bir istek oluşturuyordu. Sunucumdaki tüm kullanılabilir yuvaları kullandığım için, bu PHP istekleri sıraya konuldu, ancak Apache onlara asla ulaşamadı çünkü tüm süreçleri, PHP'nin dahili isteğini tamamlamak için bir yuva bekleyen orijinal istekle kilitlendi.

Temel olarak, PHP sunucumu bir kilitlenme durumuna sokuyordu ve Apache ancak bu bağlantılar "alt" isteklerini bekledikten sonra normal şekilde çalışmaya başlayacaktı.

Bu işlevi temamdan kaldırdıktan sonra, absunucumu istediğim kadar eşzamanlı bağlantıyla yapabilirim ve Apache beklendiği gibi sıraya sokuyor.


Bunu buraya gönderdiğiniz için teşekkürler, birkaç gündür tam olarak aynı semptomlarla ilgili bir sorun bulmaya çalışıyorum - bir de çıkmaza girmiş olduğumuzu düşünün!
James Yale

bunu nasıl belirlediniz, öncelikle ikincil giden isteği belirlemek için kullandığınız günlükler ve araçlarla ilgileniyorum.
Anirudh Goel

2

Burada olan, bağlantıları kabul edebilecek 25 iş parçanızın olması ve 26 eşzamanlı istek göndermenizdir. Bu son istek, biriktirme kuyruğunuzun boyutuna bağlı olarak soket kuyruğunda bulunur.

İkinci sorun, çalıştırdığınız her şeyin 2-3 saniye sürmesi, 25 eşzamanlı bağlantının yavaşlamasına yanıt vermek için yeterince uzun sürmesidir. uyku (1) işe yarayabilir, ancak mysql'den dosya kilitleme veya tablo kilitleme yaptığınız bir şey, her paralel istek 45 saniyelik zaman aşımına kadar tamamlanmadan önce bekliyor olabilir.

23mb mod_php ve yüklü herhangi bir modül ile bir apache işlemi için küçük geliyor, bu yüzden, uygulamanız çalışırken biraz daha fazla koç alan bu apache işlemlerini görüyor olabileceğinizden şüpheleniyorum. MaxClients ve böyle bir hafıza ile gerçekten matematik yapamazsınız ... biraz yakın olacak, ama asla bilemezsiniz.

www-data  1495  0.1  0.9  56288 19996 ?        S    15:48   0:01 /usr/sbin/apache2 -k start
www-data  1500  0.0  0.5  49684 12436 ?        D    15:48   0:00 /usr/sbin/apache2 -k start

Bir makine var, 56M ve 49M süreçleri.

başka bir makine:

www-data  7767  0.1  0.1 213732 14840 ?        S    14:55   0:08 /usr/sbin/apache2 -k start
www-data  8020  0.2  0.1 212424 13660 ?        S    14:57   0:08 /usr/sbin/apache2 -k start

başka bir makine:

www-data 28509  0.8  0.1 161720 10068 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
www-data 28511  0.8  0.1 161932 10344 ?        S    14:39   0:43 /usr/sbin/apache2 -k start

Bu nedenle, bellek kullanımı, hangi modüllerin yüklendiği vb. Göreve çok bağımlıdır. Son ikisinde, bu uygulamanın onları kullanmadığı için pdo & pdo_mysql'yi devre dışı bıraktığımıza inanıyorum.

Asıl soru şu ki, 3 saniye süren ne yapıyorsun? Bugünün dünyasında, bu sonsuzluktur ve 'engelleme' uygulaması olarak kabul edilir. Apache normalde ölmez, ancak bu iş parçacıklarına hizmet verene veya bekleme istekleri zaman aşımına uğramadan biriktirme kuyruğu kuyruğunda kalır. Başvurunuzun muhtemelen apache'nin zaman aşımına neden olduğuna inanıyorum. Sadece phpinfo () içeren bir sayfada deneyin; ve sonuçların aynı olup olmadığına bakın.


Tüm ipuçları için teşekkürler! Hala bir çok şeyi optimize etmem gerektiğinin farkındayım (sunucuyu birkaç gün önce yapılandırmaya başladım ve bu bir VPS ile ilk deneyimim), ancak sorun bundan daha derindi ... özel durumumda sorunun ne olduğunu açıklayan bir soru.
Rodrigo Sieiro
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.