apache web sunucusu sunucu durumunu yanıt vermiyor ve bağlantıyı bekleyen tüm alt süreçleri gösteriyor [kapalı]


10

Kurulumum: DNS üzerinden basit yük dengeleme ile aynı yüksek yüklü dinamik web sitesine hizmet veren neredeyse aynı 3 web sunucusu makinem var. Hizmet iki yıldır aynı apache yapılandırmasıyla çalışıyor: apache2, php5, ubuntu 8.04 linux 2.6.24-29-server.

Benim sorunum: Yaklaşık iki hafta önce bu yapılandırma ile ilgili sorunlar yaşıyorum. Neredeyse her gün, web sitesine erişilemeyen yaklaşık 5 dakika boyunca küçük bir anım var. Hala ssh üzerinden sunuculara giriş yapabiliyorum. Eğer koşarsam htop, makinenin sadece hiçbir şey yapmadığını görürüm. Yaklaşık 1000 apache işlemi var, ancak cpu aktivitesi yok.

Bu durumu ayıklamak için apache mod_status'u kullandım. Süreç skorbordu şöyle görünür:

_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

Yani süreçlerin çoğu sadece bağlantıyı bekliyor. yaklaşık 5 dakika sonra durum normale dönecektir: ben her makinede çok az süreç var, çoğu işçi "." - durumu (bir istek işlemek için açık olan meaing) ve tabii web sitesine ulaşılabilir!

Bu yüzden günlüklerde bir şey bulmaya çalışıyorum, ama hiçbir şey yok ... apache erişim günlüğü yaklaşık 4 dakika sessiz, aynı hata günlüğü için. Ayrıca diğer sistem günlüklerinde yanlış bir şey bulamıyorum.

Durum tüm 3 web sunucuları aynıdır (hepsi aynı anda bu yük tepe ve yanıt vermeyen durumu var), bu yüzden bu donanım ile ilgili bir şey yok. ancak bu bazı ağ (tcp) sorunu ile ilgili olabilir düşünüyorum.

herhangi bir fikir?

EDIT: yeni keşfettiğim bazı bilgiler:

Yine oldu ve bu sorun ortaya çıktığında yerel olarak bağlanamadığımı doğrulayabildim.

Ben gerçekleştikten sonra aşağıdaki komut ile bazı bağlantı istatistikleri yaptık: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

  • 109 CLOSE_WAIT
  • 2652 KURULDU
  • 2 FIN_WAIT1
  • 11 LAST_ACK
  • 12 DİNLE
  • 91 SYN_RECV
  • 1 SYN_SENT
  • 16 TIME_WAIT

Bir süre sonra aynı komutu çalıştırırsam, şöyle bir şey var:

  • 4 KAPANIŞ
  • 108 KURULDU
  • 18 FIN_WAIT1
  • 182 FIN_WAIT2
  • 37 LAST_ACK
  • 12 DİNLE
  • 50 SYN_RECV
  • 11276 TIME_WAIT

Yani normal durumda, şu anda apache tarafından işlenen müşteriler tarafından sadece 100-200 açık bağlantım var. Bu "çökme" olduğunda, çok daha fazla bağlantı var. Bunu analiz etmenin en iyi yolu nedir?

EDIT2: apache2.conf dosyasındaki önemli satırlar:

KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit           920
StartServers          30
MinSpareServers       80
MaxSpareServers      120
MaxClients          920
MaxRequestsPerChild   700
</IfModule>

Php_mod ile bir apache2 prefork'tur.

Sunucuda 8GB ram ve 4gb takas bölümü var.


Yerel ana bilgisayardan veya sunucular arasında bir wget veya curl çalıştırdığınızda (aynı ağ üzerindeyse) web sitesi aynı belirtileri gösteriyor mu?
Alex Forbes

Belki bir trafik dökümü ( tcpdump) sorunun köküne ulaşmanıza yardımcı olacaktır ... btw bellek kullanımınız ve güvenlik duvarı politikalarınız nedir?
drcelus

@ al4 Bu son kez ben dışarıdan web sayfasına bağlanamadı iken, yerel ana bilgisayardan sunucu durumu sayfasına bağlanmak mümkün. Bazı işçiler müsaitken, rastgele bir şey olabileceğinden emin değilim. Bu sorun dahaki sefere daha test edecek. dış ve yerel bağlantılar arasındaki herhangi bir farkı onaylayabilirsem öneriniz ne olur?
Jeff

Yerel olarak çalıştığını ancak dışarıdan çalışmadığını doğrulayabilirseniz, sorun olan ağın durumunu güçlendirir - yani, apache süreçlerini zorlamak yerine nelerin geçip gittiğini görmek için her iki uçta da tcpdumps ve wireshark ile test etmelisiniz. Ayrıca mümkünse aynı LAN üzerindeki bir ana bilgisayardan test ederdim. Ve ilişkili olabilecek ancak daha önce yaptığınız gibi görünen herhangi bir mesaj olup olmadığını görmek için dmesg'i kontrol edin.
Alex Forbes

yine oldu. ve bu sorun ortaya çıktığında yerel olarak bağlanamadığımı doğrulayabildim. Ayrıca netstat ile bazı bağlantı istatistikleri yaptık: soru metnine bakın
Jeff

Yanıtlar:



1

İlk olarak: Süreçteki Max open filessınırınızı kontrol edin . Etkin bir soket bağlantısı açık bir dosya olarak sayılır. cat /proc/###/limitsbaşka bir işlem için etkin değeri kontrol etmenin iyi bir yoludur. lsof -p ###### web sunucunuzun işlem kimliğiyle açık dosyaların bir listesini alabilirsiniz . lsof -p ### | wc -lSınıra ne kadar yaklaştığınızı görmek için karşılaştırabilirsiniz . Sınıra ulaşıyorsanız apache'nin error_log dosyasında da mesajlar görmelisiniz.

Her soket bağlantısı için ve ayrıca her cgi komut dosyası veya veri dosyası başvurusu için bir dosya tanıtıcısına ihtiyacınız vardır. 920 MaxClients için, httpd işlemi için en az 4.000 dosya yapılandırmalısınız. Aşağıdaki içeriğe sahip /etc/security/limits.d/ dosyasına bir dosya ekleyerek dosya sayısını artırabilirsiniz. Kullanıcı adının web sunucunuz için kullandığınız adla eşleştiğinden emin olun.

apache soft nofile 10000
apache hard nofile 10000

İkincisi: Bağlantı noktası tükenmesi probleminizse, /etc/sysctl.conf dosyasındaki bazı ip ayarlarını yapabilirsiniz. (İle başlayarak net.ipv4.tcp_fin_timeout). Bu genellikle sadece çok küçük bağlantılarda bir sorundur. Birçok TIME_WAIT yuva bunun bir göstergesidir, ancak bu konuda syslog hatalardan eşliğinde sadece liman tükendiğini belirtir possible SYN floodingve Sending cookies. Sunucunuzun kötü amaçlı SYN saldırılarını engelleyebilecek bir güvenlik duvarının arkasında olduğundan da emin olmalısınız.


0

Ayrıca, prefork MPM'de her işlemin bellek alanında PHP olacağını unutmayın (bellek sınırı ayarı nedir?). Biraz farklı bir PHP modülü gerektirebilecek çalışan MPM'ye geçmeyi deneyebilirsiniz.

Ayrıca harici modüllerin Apache yapılandırmanızı düzeltmek için uzaktan küpe değer

Deneyimlerime göre, bu tür şeyler bir arama motoru tarayıcısı veya ARP çakışmaları gibi şeyler tarafından tetiklenir. Veya ağın ilgili bir kısmındaki trafik seviyeleri.

'Sar' kelimesini yararlı bulabilirsiniz ... en arkadaşça değil, ama kesinlikle yararlı.

Muhtemelen de io ile ilgilidir. Sar size (disk etkinliğini kaydetmek için yapılandırırsanız) ortalama io bekleme süresinin ne olduğunu söyleyebilir. Ayrıca, IO Bekleme süresine en üstte bakabilirsiniz (bu bir yüzde, aslında ne anlama geldiğini okuyun). SAN veya sanal ortam kullanıyorsanız, bu önemli olabilir.

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.