PHP-FPM'yi sürekli yeniden yüklemek zorunda


27

Nginx ve PHP-FPM ile çalışan oldukça yoğun yüklü bir sunucumuz var. Bu sunucuda 6 tane web sitemiz var, PHP-FPM ve nginx kullanıyoruz. Yazılımın tümü vBulletin 3.8 ve WordPress'tir. Veritabanları ayrı bir sunucudadır.

Şimdi, bunlar oldukça popüler web siteleri olduğundan, normalde bir kerede çevrimiçi olarak 7-8.000 ziyaretçimiz vardır ve her sayfa çoğunlukla veritabanına isabet etmektedir. Bunun sorunlarımızın nedeni olduğuna inanıyorum.

MySQL sunucusunda çok fazla büyük veritabanımız olduğundan ve sorgular dürüst olmak gerekirse, yazılımda çok daha iyi olabileceğinden, MySQL'in zaman zaman PHP'ye sonuçları döndürememesi, sonuçta kaskad etkisi yaratacağını düşünüyorum. PHP-FPM'yi yeniden yükleyene kadar her şeyin durmasına neden olur. Bunu yaptıktan sonra, işler tekrar iyi çalışmaya başlar.

Bu sorunu gidermede sorun yaşama sebebim, kayıtlardan hiçbir şeyi gerçekten ayırt edemememdir. MySQL yavaş sorgu günlüğünde, aksama süresi olduğunda ilgilenilen hiçbir şey göremiyorum. Nginx kayıtlarında, okuma isteğinin zaman aşımına uğradığını veya bağlantının zaman aşımına uğradığını söyleyen binlerce giriş görüyorum (PHP-FPM'ye). Ve PHP-FPM günlüklerinde, "yürütmenin zaman aşımına uğradığını (31 sn) sonlandırdığını söyleyen birçok satır görüyorum.

Dolayısıyla bu noktada sorunu nerede arayacağımı tam olarak bilmiyorum. Açıkçası, her ne oluyorsa, bu senaryolar bazen yeterince hızlı bir şekilde yürütülmüyor çünkü (Normalde bir saniyenin altına yüklenir, ancak yükleme süresinin yükselmesine neden olan bir şey olur). Bu, günde birçok kez olur ve bizim için oldukça sorun oldu.

Şimdilik sadece her 10 dakikada bir php5-fpm yeniden yüklemesine hizmet edecek bir crontab'ım var, bu da çökme sorununu önemser. Tabii ki, PHP yeniden yüklendiğinde, nginx 502 ağ geçidi hatası veriyor, bu yüzden çok fazla bir çözüm değil.

PHP, önemliyse APC önbelleği çalıştırıyor. Birkaç noktada APC'nin bazı şartlar altında askıda kalmasına neden olabileceğini okudum.

Herhangi bir işaretçi yardımcı olacaktır. Bu makine için sürekli endişelenmek zorunda kalmamı isterdim.

Elbette daha fazla bilgi sağlanabilir. Sadece ihtiyacın olanı bana bildir.

Güncelleme: apc.php dosyasını bir web köküne kopyaladım ve istatistiklere bakmak için eriştim. İşler iyi görünüyordu. Ardından Kullanıcı istatistiklerine gitmek için bağlantıyı tıklattım ve sunucuyu BOOM anında kapattım. Php-fpm'yi yeniden yükledim ve ardından kullanıcı istatistikleri sayfasını yeniden yükledim ve iyi geçti. Bir dakika bekledim, tekrar yükledim, sunucu tekrar kapatıldı.

Yani bu kesinlikle APC ile ilgili görünüyor. Soru şu - Nasıl düzelteceğiz?

APC Yapılandırması:

[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1"
apc.ttl = "3600"
apc.user_ttl = "7200"
apc.gc_ttl = "3600"
apc.cache_by_default = "1"
apc.filters = ""
apc.write_lock = "1"
apc.num_files_hint= "10000"
apc.user_entries_hint="10000"
apc.shm_size = "1G"
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.include_once_override = "0"
apc.file_update_protection="2"
apc.canonicalize = "1"
apc.report_autofilter="0"
apc.stat_ctime="0"

Güncelleme 2: Burada bu konuda bir miktar ilerleme kaydettik. WordPress önbelleğe alma eklentisinin (W3 Total Cache) çökmelere neden olduğu ortaya çıktı. Nedenini hala bilmiyoruz, ancak devre dışı bırakılmış durumdayken PHP'yi yaklaşık 4 saattir yeniden yükleme, yavaşlama ve çökme olmadan çalıştırıyoruz. Hala vBulletin forumlarında APC kullanıyoruz ve sorun yok. NEDEN APC'nin çökmekte olduğunu tespit etmenin bir yolu var mı ? Bunu WordPress kurulumlarımızda kullanmayı çok isterdim, ancak kırılgan bir sistemin maliyetine değil.


Sahip olduğunuz APC ile ilgili ayarları gönderebilir misiniz?
Kyle,

Evet, iyi fikir. Bitti.
Kevin,

Bu makinede ne kadar koç ve takas var? Ölmeye başladığında ne kadar kullanılır?
Kyle,

2
APC korkunç bir kabus ve yıllardır web sitelerimden birinde bu tür çöküşlerin tek kaynağıydı . Sonunda tamamen ondan kurtuldum; PHP artık sağlam. Önbelleğe almak istiyorsanız, PHP 5.5'teki varsayılan önbellek olan Zend Opcache'yi deneyin.
Michael Hampton

1
Evet, PHP'yi çökerten APC olarak sona erdi. APC'yi devre dışı bıraktığımızda sürekli PHP'yi yeniden başlatmak zorunda kaldık.
Kevin

Yanıtlar:


27

Php-fpm kullanıyorsunuz, bu yüzden php-fpm'nin çocuklarının ne kadar süreyle yaşamasına izin verileceği konusunda daha agresif davranmanızı öneriyorum. Kısa ömürlü dişler / çocuklar ve stabilite arasındaki tatlı noktayı bulmanız gerekir. Php-fpm varsayılanları, herhangi bir üretim sistemi olan IMHO için cömert yollardır.

Üretim havuzlarınız için pm.max_requests sayısını azaltabilirim . Sanırım varsayılan 200'dür. 50'den başlar ve bunun sizi nereye götürdüğünü görürüm.

Bunu başaramaz / tamamlayamazsanız, şu küresel seçenekleri de deneyebilirsiniz (AFAIK, tümü varsayılan olarak devre dışıdır):

emergency_restart_threshold=3
emergency_restart_interval=1m
process_control_timeout=5s

Ne anlama geliyor? 3 PHP-FPM alt işlemi 1 dakika içinde SIGSEGV veya SIGBUS (örn. Çökme) ile çıkarsa, PHP-FPM'nin otomatik olarak yeniden başlatılması beklenir. Çocuk süreçler, ana sinyallerden bir reaksiyon için 5 saniye bekler.

Bu, PHP çalışan havuzunuzu güzel, taze ve temiz tutmalıdır. Bir işçinin isteklerini yerine getirme süresi uzadıkça, kararsız hale gelir. Ayrıca bellek sızıntısı riski daha yüksektir.

İşte burada bahsettiğim tüm yapılandırma seçeneklerinin yanı sıra diğerleri hakkında güzel bir genel bakış: http://myjeeva.com/php-fpm-configuration-101.html

Umarım bu ipuçları size yardımcı olur! Çimdiklemeyi ve gözlemlemeyi unutmayın, ne yazık ki tüm bunlar için bir kural yoktur, PHP'nin davranışını ve istikrarını etkileyen çok fazla değişken vardır.


1
Her saat php5-fpm'yi yeniden başlatmak için cron kullanmayla ilgili fikriniz nedir?
CMCDragonkai 18:15

2
Bu oldukça zorlu bir yöntemdir ve hiç çalışmayabilir. PHP-FPM yerleşik bir takım ince ayarlara sahiptir, bu yüzden bu ince ayarlamayı kullanmak daha iyidir.
Rouben

1
Bu cevap beni doğru yöne gösterdi. Benim için çözüm değiştirmek oldu, kendimi böyle benzer bir sorunu gördüm pmgelen dynamicetmek ondemandve tüm diğer varsayılan değerlerle şimdi büyük çalışıyor görünüyor.
llanato

(php-fpm.conf dosyasında), anahtarı ve değeri ayırmak yerine '' yerine '=' olmalıdır. emergency_restart_threshold = 3 emergency_restart_interval = 1m process_control_timeout = 5s
justyy

Ben alıyorumERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'
deweydb
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.