Apache ve PHP ile bellek sızıntısı nasıl araştırılır?


16

Finansal modelleme yapan ağır bir Drupal web sitesi işletiyoruz. Apache işlemlerinin sayısı sabit kalırken, apache tarafından kullanılan belleğin fazla mesaisi arttığı gerçeği göz önüne alındığında, bir tür bellek sızıntısıyla karşılaşıyoruz:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Bellek sorununun apache / PHP'den geldiğini biliyoruz çünkü her yayınladığımızda /etc/init.d/httpd reloadbellek kullanımı düşer (yukarıdaki ekran görüntüsüne ve CLI çıktılarının altına bakın):

Httpd yeniden yüklemeden önce

ücretsiz
             toplam kullanılan ücretsiz paylaşılan arabellekler önbelleğe alındı
Mem: 49447692 45926468 3521224 0 191100 22609728
- / + tamponlar / önbellek: 23125640 26322052
Takas: 2097144 536552 1560592

Httpd yeniden yüklendikten sonra

ücretsiz
             toplam kullanılan ücretsiz paylaşılan arabellekler önbelleğe alındı
Mem: 49447692 28905752 20541940 0 191360 22598428
- / + tamponlar / önbellek: 6115964 43331728
Takas: 2097144 536552 1560592

Her apache iş parçacığına memory_limit512MB değerinde bir PHP atanır , bu da yüksek bellek kullanımının düşük istek hacmini ortadan kaldırdığını ve max_execution_timeyürütmenin daha uzun sürdüğü iş parçacıklarını sonlandırması gereken ve bu nedenle bellek kullanımında sürekli büyümeyi önlemesi gereken 120 saniyelik bir atandı. görme.

S: Bu bellek sızıntısına neyin sebep olduğunu nasıl araştırabiliriz?

İdeal olarak, dev ekibini rahatsız etmeden sistemde gerçekleştirebileceğim sorun giderme adımlarını arıyorum.

İlave bilgi:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

FYI ayrı ayrı araştırdığımız takas sorununun farkındayız ve takas oluşmaya başlamadan önce gözlemlediğimiz bellek sızıntısıyla ilgisi yok.


Son kez LAMP + Drupal ile ciddi bir bellek kullanım sorununu vurduğumda PHP memcached kütüphanesi kullanıyordum. Aldıktan sonra bellek kullanımı çok dramatik bir şekilde düştü. Sadece bir tahmin. Biraz sonra sizin için uygun bir cevap yazabilir.
Janne Pikkarainen

@JannePikkarainen: PHP memcachedkütüphanesini kullanıyoruz . Memcache yönetici sayfasına dayanarak, memcache.phpgörebildiğimiz tek şey 5GBmemcache'e tahsis edilmiş olduğumuzdur 3.3GB. Burada bize daha fazla yardımcı olabilirseniz harika olurdu.
Max

Evet, memcachedarka plan programının kendisi muhtemelen gayet iyi. Bu bellek sızıntı olabilir veya olmayabilir (ve böylece Apache süreçleri bellek kullanımı büyür) PHP memcache kütüphanesidir. Benim sorunum yaklaşık 1-2 yıl önceydi, bu yüzden bundan sonra işler düzeltilmiş olabilir. Her neyse, memcached sizin için zorunlu değilse, bir süreliğine devre dışı bırakmayı deneyin ve Apache bellek kullanımının hala büyüyüp büyümediğine bakın.
Janne Pikkarainen

Asıl sorun nedir? Performans zayıf mı? Çözmenize yardımcı olmamız gereken problemi açıklamadan bize belirtileri söylüyorsunuz. (Peki bahsettiğin bu değişim sorunu nedir? Performansı etkileyen o kadar çok şey değiştiriyor musun?)
David Schwartz

@DavidSchwartz: Sorun, yeniden başlatmazsak httpd, bellek kullanımının büyümeye devam etmesi ve kutunun sonunda bazı bellek çekirdeği mesajlarıyla çökmesidir . Performanslar iyidir (bellek kullanımı bellek sınırına yaklaşana kadar). Lütfen takas sorununu dikkate almayın.
Max

Yanıtlar:


11

Bellek sorununun apache / PHP'den geldiğini biliyoruz, çünkü /etc/init.d/httpd dosyasını yeniden yüklediğimizde bellek kullanımı düşüyor

Hayır - bu sadece web trafiğiyle ilgili olduğu anlamına gelir. Kutuda mysql çalıştırdığınızı - muhtemelen web sunucusu için verileri yönettiğinizden - bahsettiğiniz gibi burada suçlu olabilir. Web sitenizin kullandığı diğer hizmetler gibi sizin bahsetmediğiniz hizmetler de olabilir.

Her apache iş parçacığına 512MB değerinde bir PHP memory_limit atanır.

Hayır değil. Ortalama 7 ve en fazla 25 meşgul sunucu bildiriyorsunuz - ancak bellek grafiğiniz 25Gb civarında bir delta gösteriyor.

Gerçekten temel HTTP ayarıyla tekrar başlamalısınız - sabit bir 256 httpds çalıştırıyor gibi görünüyorsunuz, ancak en yüksek kullanımınız 25'tir - bu sadece düz aptal.

ve yürütmenin daha uzun sürdüğü iş parçacıklarını sonlandırması gereken en fazla 120 saniyelik 120 sn.

Hayır - yalnızca yürütme dizisi PHP yorumlayıcısı içindeyse - PHP engellenmişse değil.

finansal modelleme yapan

(iç çekmek)

Saklı yordamlar kullansanız da, Apache'yi nasıl yapılandırdığınız, iş parçacıklı veya prefork, hangi sürüm, PHP'nin nasıl çağrıldığı (modül, cgi, fastcgi), saklı yordamlar kullansanız da, ayrıntılar sağlamanız yararlı olurdu.

Mysql'i ayrı bir makineye taşıyarak başlamanızı ve kalıcı bağlantılar kullanmayı bırakmanızı öneririm (şu anda bunları kullanıyorsanız). Bellek sınırını çok daha düşük bir değere ayarlayın ve komut dosyası başına bunu geçersiz kılın. Dairesel referans çöp toplayıcısının kurulu ve yapılandırılmış olduğundan emin olun.


2

Muhtemelen şimdiye kadar sorununu çözmüşsün. Sunucunun takas / daralmasını önlemek için bir ara olarak cron'dan her saat aşağıdaki komutu çalıştırıyorum:

#!/bin/sh 
sync; echo 3 > /proc/sys/vm/drop_caches

Bunun bir çözüm olduğunu söylemiyorum, sadece işleri devam ettirmenin ve bellek sızıntısının gerçek nedenini araştırırken duruş süresini en aza indirmenin bir yolu.

Daha fazla ayrıntıyı burada bulabilirsiniz.

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/


1

Görünüşe göre bu PHP'nin çalışma biçimidir - ve nesneleri ayırdığınız uzun döngüler yapıyorsanız ve bunları referans olarak da iletip iletmediğinizi bilenler, bu yüzden onunla başa çıkmanın tek yolu, her PHP işlemi için N isteğinden sonra durdurmak için. PHP'yi CGI olarak çalıştırırsanız, her istek yeniden doğmasını sağlar - bu nedenle bellek sızıntısı olmaz ve performans düşüşü çok büyük olmayabilir. Fast-cgi'yi de çalıştırabilirsiniz, örneğin her 1000 istekte php-fcgi işlemi istenir ve bellek serbest bırakılır - yine bellek sızıntısı olmaz. PHP'yi mod_php modülü olarak çalıştırırsanız, yardımcı olup olmadığını görmek için httpd.conf dosyasında maksimum istekleri ayarlamayı deneyebilirsiniz. Örneğin, 10'u kurmaya çalışırdım - eğer işe yarayacaksa, performans düşüşü yüksek olmayacak, ancak bellek sızıntısı olmamalı,


-1

Global php.ini dosyasındaki belleği kontrol edin. dont sadece 1 G vb. Genellikle çoğu hesap için yeterli olduğundan, küresel php.ini sınırını yaklaşık 64 milyona ayarlamanızı öneririm

apache ayarlarınızı da kontrol edin

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.