Hangi kurulum: Apache Worker veya Prefork? Her birinin (dis-) avantajları nelerdir?


55

Her ikisi için de açıklamalarda dayanarak Prefork ve İşçi MPM, Prefork tipi biraz modası geçmiş görünüyor, ama gerçekten iki tip düzgün bir karşılaştırma bulamıyor.

Ne bilmek isterdim:

  • İki sürüm arasındaki farklar nelerdir?
  • Her sunucu türünün (dis-) avantajları nelerdir?
  • Koşullara göre hangi tipin seçileceğine dair herhangi bir temel kural var mı?
  • İkisi arasında büyük performans farkları var mı?

Yanıtlar:


40

Dokümanların söylediği gibi, iş parçacığı güvenliği olmayan kitaplıklar ile uyumluluk için bir iş parçacığından kaçınmanız gerekiyorsa prefork MPM'yi kullanmalısınız. Tipik olarak, önemsiz olmayan herhangi bir Apache modülü ( mod_php- veya daha doğrusu, kanonik bir örnek olarak bağlandığı uzantı ve kitaplıkların sayısızlığı) bir tür güvenli olmayan kitaplığa sahiptir (ya da iş parçacığı olmayan) güvenli kod), bu yüzden güzel bir stok Apache yükleme kullanmıyorsanız, prefork MPM için giderdim.


3
PHP çalıştırmıyorsanız, işçi MPM'sini tavsiye ederdim. Worker, apache'den önerilen MPM'dir ve daha iyi performans ve daha düşük ek yük sağlar. Sadece PHP geliştiricisi, prefork kullanmanız gereken iplik güvenliğini hiç duymamış.
David Pashley

16
PHP çok uzun zamandır iş parçacığı güvenli olmuştur. Diğer kütüphanelerin ne yaptığını kontrol edemedikleri için yalnızca ön çatal kullanımı önerdiler. Diğer geliştiricilerin eylemsizlikleri için PHP'yi suçlamayı bırak.
Alister Bulman

3
PHP iş parçacığı güvenli olabilir (her ne kadar şüphem olsa da), ancak bağlantı verdiği tüm kütüphaneler kesinlikle değildir. Burada birkaç büyük PHP uygulaması kullanıyoruz ve her birkaç ayda bir prefork'tan çalışanlara geçmeye çalışıyoruz, ancak derhal bozuk veriler elde ediyoruz.
Aleksandar Ivanisevic

5
En azından fonksiyon değiştirme ENV değişkeni iplik güvenli olmayacaktır, setlocal php.net/manual/en/function.setlocale.php bunun ortak bir örneğidir .
yarıçapı

4
Bir not: PHP örneğin php-fpmFastCGI ile eklenmişse bu sorunlar geçerli değildir . Ardından çalışan MPM gayet iyi durumda - fpm, Apache'nin iş parçacığı çalışabilmesi için her PHP isteğini kendi işleminde çalıştıracak. PHP-Thread-güvenlik sorunu, yalnızca mod_phpApache işleminde PHP'yi çalıştıran kullanmanızı engeller .
mschuett

13

Çok sayıda (> 100) eşzamanlı bağlantı sunarken güvenli olmayan uzantıları çalıştırmanın klasik çözümü, fastCGI (mod_fcgid, yerel apache modülü) üzerinde PHP çalıştırmak ve Worker MPM'yi çalıştıran bir apache örneğinden gelen proxy dinamik istekleridir.

Bu, statik ve dinamik bir içerik karışımını sunarken, az miktarda belleğe (4 ~ 8 GB) sahip birkaç yüz ile> 1000 arasında eşzamanlı bağlantıdan ölçeklenmenize olanak sağlar.

Elbette, genel dağıtımınızın bir parçası olarak ön uç önbellekleme çözümlerini de incelemelisiniz (memcached, vernik).

Alternatif olarak, eşzamanlılığı çok daha gelişmiş bir şekilde ele alan apache 2.4 ve yerel olay MPM'ye yükseltin (bağlantı kesilirken çağrılmaları beklenir.


mpm yorumu etkinliğini genişletebilir misiniz? Mpm-işçi vs nasıl yığar?
Sirex

İşçi MPM'si zaten iş parçacığı temelliydi ve bu nedenle başlatmak ve çalıştırmak için daha hızlı olmakla birlikte, MPM olayı artık soketi sorgulamıyor - etkinlik hakkında bilgilendiriliyor; bu nedenle, "olay".
adaptr

bu nedenle, yüksek trafikli (13k / sn) sitelerde daha iyi çalışması gerekir mi?
Sirex

6

Sorunun gönderilmesinden bu yana yaklaşık 3 yıl geçti, ancak daha iyi performans elde etmek için PHP kullanıyorsanız bile çatal öncesi işçi yerine MPM ile çalışmanızı tavsiye ederim.

Farklılıklara gelince, ön çatal dişli değildir, bu nedenle sunucu her bir müşteri talebi için bir işlem talep eder (çatallaşmanın tepki süresi içinde yemek yememesi için yeni isteklerin öngörülmesini öngörür). Talepler sunucuda ayrı bir işlem olduğundan, bu genellikle hafızanızı ve CPU'nuzu çok daha fazla harcar. İşçi, daha hafiftir ve daha iyi bellek kullanımı olan çoklu iş parçacığı getirir.


2

Bu neye hizmet ettiğinize çok özel bir şey. Çok sayıda küçük statik bağlantı yapıyorsanız, dişliler daha hafif ve daha hızlı olacaktır. Sürekli ortaya çıkan birkaç büyük uygulamanız varsa, prefork olgunluk ve istikrar nedeniyle bir avantaj sağlayabilir. Neden ihtiyacınız olanı ayarlamıyor, birini test etmiyor, MPM modülünü değiştirmiyor, tekrar deniyor, hangisinin size daha uygun olduğunu görün?


Apache 2.2'de MPM'yi keyfi olarak "takas edemezsiniz"; derleme zamanında ayarlanır.
adaptr

Apt veya RPM'ler ile yapabilirsiniz. Debian, tercih ettiğiniz stile bağlı olarak birkaç farklı Apache 2 paketine sahiptir.
Brendan Byrd,

1

Sahip olacağınız trafik türü ve cinsine ihtiyacı var. Ve ayrıca öncelikle prefork ve işçi arasındaki temel farkı anlamanız gerekir. Aşağıdaki yazı size yardımcı olacaktır umarım! http://slashroot.in/how-is-nginx-different-from-apache


2
İçeriğe sahip olmak yerine içeriğe sahip olmak için cevapları tercih ediyoruz. Bağlantı hedefinde ne olduğuna dair bir özet verebilirseniz, bu en iyi yöntemdir. Link-rot olur.
sysadmin1138

1
Soru Apache ile ilgilidir (nginx apache değildir) ve prefork ya da
thread'ın
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.