Soru Hangi Apache MPM'nin kullanılacağını nasıl seçerim?


Bu bir Kanonik Soru Doğru Apache httpd MPM'yi seçme hakkında.

Apache - 'worker', 'event', 'prefork', vb. Tarafından sunulan farklı MPM'ler arasında biraz kafam karıştı.

Aralarındaki büyük farklar nelerdir ve belirli bir dağıtım için hangisinin en iyi olacağına nasıl karar verebilirim?


245
2018-04-26 18:40


Menşei


Mod_php'yi destekliyorsanız, prefork yapıyorsunuz. - Zoredache
@Zoredache:? PHP'den hiç bahsetmedi ve eğer olsa bile, mod_php sadece olayı eleyecekti. Yoksa 8 yıl önce RL tarafından yapılan bir yoruma hala bağlı mısın? PHP'de geçen apache ile ilişkili son hata 2005'te yapıldı. - symcbean
Üzgünüm - bunu kapatmak için oy vermeliyim - burada cevaplamak için çok geniş bir soru. - symcbean
@symcbean Re: PHP ve Threads - PHP'nin çekirdeği bu günlerde threadafe'tir, ancak bir sürü insan derlemeyi bulamıyorsunuz. Geçen sene olduğu gibi ısırıldım, bu yüzden üretimde ona güvenmeden önce bir "test (kapsamlı olarak)" durumu hala ... - voretaq7
Kullandığınız işletim sistemine bağlı olarak, tüm bu seçeneklerin standart bir yükleme ile mevcut olmayabilir. - John Gardeniers


Cevaplar:


Bir dizi var MPM modülleri (Çok İşlem Modülleri), ancak en yaygın olarak kullanılan (en azından on nix platformları) üç ana modeldir: prefork, worker, ve event. Esasen, Apache web sunucusunun evrimini ve sunucunun, uzun (yazılım açısından) tarih boyunca, zamanın hesaplama kısıtlamaları içinde HTTP isteklerini ele almak için oluşturulduğu farklı yolları temsil eder.


prefork

mpm_prefork ... iyi .. her şeyle uyumlu. Taleplerin sunulması için bir dizi çocuk sürecini başlatır ve çocuk süreçleri bir seferde yalnızca bir istekte bulunur. Orada oturan sunucu süreci var, eylem için hazır ve iş parçacığı marshaling ile uğraşmaya gerek yok aslında Daha hızlı Bir kerede yalnızca tek bir istekle uğraşırken daha modern iş parçacıklı MPM'lerden daha fazladır - ancak eşzamanlı istekler acı çeker, çünkü bir sunucu işlemi ücretsiz oluncaya kadar beklemek için üretilirler. Ek olarak, prefork çocuk süreçleri sayısında artmaya çalışırken, bazı ciddi RAM'leri kolayca emeceksiniz.

İplik güvenli olmayan bir modüle ihtiyacınız olmadıkça, prefork kullanmak muhtemelen tavsiye edilmez.

Kullanın: İplik kullanıldığında kırılan modüllere ihtiyacınız var, mod_php. O zaman bile, FastCGI kullanmayı düşünün ve php-fpm.

Eğer kullanmayın: Modüllerin diş açmada kırılmaz.

worker

mpm_worker iş parçacığı kullanır - bu eşzamanlılık için büyük bir yardımcıdır. Çalışan bazı alt süreçleri kapatır; prefork'a benzer şekilde, bazı yedek dişler, mümkünse, gelen bağlantılara hizmet etmek için hazır tutulur. Bu sayının RAM üzerinde çok güçlü olması, iş parçacığı sayısının ön bellekte sunucu sayısı gibi bellek kullanımı üzerinde doğrudan bir yatağa sahip olmamasıdır. Ayrıca, eşzamanlılığı çok daha kolay bir şekilde gerçekleştirir, çünkü bağlantıların, önkurulumda bir yedek sunucu yerine, (genellikle mevcut olan) ücretsiz bir iş parçacığı beklemesi gerekir.

Kullanın: Apache 2.2 veya 2.4'tesiniz ve öncelikle SSL kullanıyorsunuz.

Eğer kullanmayın: Uyumluluk için önkoşuma ihtiyacınız olmadıkça, gerçekten yanlış gidemezsiniz.

Ancak, basamakların eklendiğine dikkat edin. bağlantıları ve yok istekler - Bu, canlı bir bağlantının, kapalı olana kadar her zaman bir iş parçacığı tuttuğunu (yapılandırmanıza bağlı olarak uzun sürebilir) anlamına gelir. İşte bu yüzden ..

event

mpm_event yapısal olarak işçi için çok benzer; Apache 2.4'te 'deneysel' den 'durağan' durumuna taşındı. Büyük fark, canlı-canlı bağlantılarla uğraşmak için ayrılmış bir iplik kullanmasıdır ve eller, sadece bir istek yapıldığında (sadece iş parçacığı, istek tamamlandıktan sonra hemen geri serbest bırakılmasına izin verilmesi) çocuk iş parçacığı istemlerini istemektedir. Bu, bir seferde mutlaka aktif olmayan istemcilerin eşzamanlılığı için harikadır, ancak ara sıra isteklerde bulunur ve istemciler uzun süre hayatta kalma zaman aşımına sahip olabilirler.

Burada istisna SSL bağlantıları ile; Bu durumda, işçiye aynı şekilde davranır (bağlantı kapanana kadar belirli bir iş parçacığına verilen bir bağlantıyı yapıştırma).

Kullanın: Apache 2.4'tesiniz ve iş parçacıklarını seviyorsunuz, ancak boş bağlantılarını bekleyen iş parçacıklarını sevmiyorsunuz. Herkes konuları sever!

Eğer kullanmayın: Apache 2.4'te değilsiniz ya da uyumluluk için prefork'a ihtiyacınız var.


Bugünün dünyasında Yavaş loris, AJAX ve 6 TCP bağlantılarını (elbette hayatta kalmaya devam ederek) sunucunuza çoğaltmaktan hoşlanan tarayıcılar, eşzamanlılık, sunucu ölçeğinizin oluşturulması ve ölçeklendirilmesinde önemli bir faktördür. Apache'nin tarihi, bu bağlamda bu konuya bağlıydı ve kaynak kullanımı ya da ölçeği açısından nginx ya da lighttpd gibileriyle hala uyuşmuyor olsa da, geliştirme ekibinin hala alakalı bir web sunucusu oluşturma yolunda ilerlediği açık. günümüzün yüksek talep-eşzamanlılık dünyasında.


398
2018-04-27 02:27



-1: IME, çalışan yalnızca httpd ayak izinin boyutunu% 15 oranında azaltır (IIRC Linux RSS'de COW rapor eder, bu da ön-çatalın sanki olduğundan daha fazla bellek kullanıyor gibi görünür). Bir işlemin çekirdek izi ile NPTL iş parçacığı arasında ihmal edilebilir bir fark var. Dünyayı parçalamaktan çok uzak bir yol. Bir iş parçacığını beklemenin ve ayırmanın neden (zaman önceden belirlenmiş) bir işlemi beklemekten / zamanlamaktan ziyade terimleri zamanlamada daha verimli olduğunu düşündüğünüzü anlamıyorum. Ne düşündüğünüzü, SSL'nin tüm o patlamada ne kadar olduğunu düşünüyorsunuz. - symcbean
@symcbean Yani% 15 RAM kullanımının anlamlı olmadığını mı söylüyorsunuz? Bu iyi, ama benim düşüncem başka türlü olurdu. Eşzamanlılık performans iddiaları benim değil. Görmek İşte. Ve SSL farkı MPM olayı belgelerinde açıkça dile getirildi: The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection. - Shane Madden♦
@ShaneMadden `ve hala kaynak kullanımı ya da ölçek açısından nginx ya da lighttpd'nin beğenisine ayak uydurmamakla birlikte, bu sistemlerin her ikisini de apache tabanım vardı. - Kelly Elton
@ShaneMadden, SSL ve event MPM ile ilgili problemle ilgili olarak: nginx'in apache'den önemli ölçüde daha iyi işleyip işlemediğini biliyor musunuz? - DASKAjA
Öyle görünüyor ki, eğer mpm modüllerini bilmeden apache 2.4'ü derlerseniz, modülün event mpm modülü ile birlikte gelir ve mod_php7 ile çalışır (şu anda mpm'yi araştırıyorum çünkü apache2.4, mysql bağlantı limitini aşmaktadır, apache 2.2 ise aynı mysql sunucusuyla) değil) - BioHazard


Çoğunlukla kullanmak istediğiniz Apache modüllerine bağlıdır. Bence işçi genellikle varsayılan seçimdir, ancak bazı (daha eski) modüller forfor gerektirir ve prefork'a bağlıdır.

Tercihleriniz yoksa, OS dağıtımınızdan tercih edilen bağımlılığı kullanmanızı öneririm. Örneğin Ubuntu, Apache2'yi yüklediğinizde varsayılan olarak mpm-worker'ı kuracaktır.


5
2018-04-26 19:32





İşte gif ile nasıl çalıştığına dair iyi bir açıklama:

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

Kısaca: eğer varsa 2.4 ve httpd olarak bir ters proxy (dispatcher) bu yüzden seçiminiz bir Etkinlik MPM'si


5
2018-06-21 13:10





Şubat 2018'den itibaren, Apache 2.4 belgelerine ilişkin Etkinlik MPM'si, Apache'yi bir proxy olarak kullanmanın, 2.4.24'ten beri tasarlanan şekilde çalışmasından "gelişmiş bağlantı işlemlerini" sürdüreceğini belirtiyor. Bakın Sınırlamalar Bölüm.

Mesele, bir vekil olarak, işçinin cevabın sonunun nerede olduğunu söyleyememesi ve kontrolün dinleyiciye geri gönderilmesinden önce bütün cevabı görene kadar beklemeye zorlanmasıdır.

Bu nedenle, Apache'nin bir proxy olarak kullanıldığı zaman, Worker modelinin kullanılması en iyi sonuç olabilir. Vekil bir ortamda etkinlik modeline getirilen avantajlar varsa, belki de tam olarak belli değil.


3
2018-02-14 15:01