Bagaimana cara saya memilih Apache MPM mana yang akan digunakan?

261

Ini adalah Pertanyaan Canonical tentang memilih Apache httpd MPM yang tepat.

Saya sedikit bingung antara MPM berbeda yang ditawarkan oleh Apache - 'pekerja', 'acara', 'prefork', dll.

Apa perbedaan utama di antara mereka, dan bagaimana saya bisa memutuskan mana yang terbaik untuk penempatan yang diberikan?

Tiffany Walker
sumber
4
Jika Anda mendukung mod_php, maka Anda melakukan prefork.
Zoredache
6
@Zoredache:? dia tidak pernah menyebutkan PHP, dan meskipun dia punya, mod_php hanya akan mengesampingkan acara. Atau apakah Anda masih berpegang teguh pada komentar yang dibuat oleh RL 8 tahun yang lalu? Bug terakhir yang dicatat dalam PHP yang terkait dengan ulir apache adalah pada tahun 2005.
symcbean
2
Maaf - harus memilih untuk menutup ini - adalah pertanyaan yang terlalu luas untuk dijawab di sini.
symcbean
1
@symcbean Re: PHP dan Threads - Inti PHP adalah threadsafe hari ini, tetapi banyak hal lain yang Anda akan menemukan orang yang dikompilasi tidak. Saya telah digigit baru-baru ini tahun lalu, jadi ini sangat "tes (luas) sebelum bergantung pada produksi" situasi masih ...
voretaq7
Bergantung pada OS yang Anda gunakan, Anda bahkan mungkin tidak memiliki semua opsi itu dengan instalasi standar.
John Gardeniers

Jawaban:

415

Ada sejumlah modul MPM (Multi-Processing Modules), tetapi sejauh ini yang paling banyak digunakan (setidaknya pada platform * nix) adalah tiga yang utama: prefork, worker, dan event. Pada dasarnya, mereka mewakili evolusi dari server web Apache, dan berbagai cara server telah dibangun untuk menangani permintaan HTTP dalam batasan komputasi waktu selama sejarahnya yang panjang (dalam istilah perangkat lunak).


prefork

mpm_preforkadalah .. yah .. itu kompatibel dengan semuanya. Ini memutar sejumlah proses anak untuk melayani permintaan, dan proses anak hanya melayani satu permintaan pada suatu waktu. Karena ada proses server yang duduk di sana, siap untuk bertindak, dan tidak perlu berurusan dengan marshaling, itu sebenarnya lebih cepat daripada MPM berulir yang lebih modern ketika Anda hanya berurusan dengan satu permintaan pada satu waktu - tetapi permintaan bersamaan menderita, karena mereka dibuat untuk mengantri sampai proses server gratis. Selain itu, mencoba meningkatkan dalam proses anak prefork, Anda akan dengan mudah menyedot beberapa RAM serius.

Mungkin tidak disarankan menggunakan prefork kecuali Anda membutuhkan modul yang tidak aman.

Gunakan jika: Anda memerlukan modul yang rusak ketika utas digunakan, misalnya mod_php. Bahkan kemudian, pertimbangkan untuk menggunakan FastCGI dan php-fpm.

Jangan gunakan jika: Modul Anda tidak akan pecah dalam threading.

worker

mpm_workermenggunakan threading - yang merupakan bantuan besar untuk konkurensi. Pekerja memutar beberapa proses anak, yang pada gilirannya spin off thread anak; mirip dengan prefork, beberapa thread cadangan tetap siap jika memungkinkan, untuk melayani koneksi yang masuk. Pendekatan ini jauh lebih baik pada RAM, karena jumlah thread tidak memiliki pengaruh langsung pada penggunaan memori seperti jumlah server di prefork. Ini juga menangani konkurensi jauh lebih mudah, karena koneksi hanya perlu menunggu utas gratis (yang biasanya tersedia) daripada server cadangan di prefork.

Gunakan jika: Anda menggunakan Apache 2.2, atau 2.4 dan Anda menjalankan terutama SSL.

Jangan gunakan jika: Anda benar-benar tidak bisa salah, kecuali Anda membutuhkan prefork untuk kompatibilitas.

Namun, perhatikan bahwa tapak terpasang ke koneksi dan bukan permintaan - yang berarti bahwa koneksi yang tetap hidup selalu menahan utas sampai ditutup (yang bisa lama, tergantung pada konfigurasi Anda). Itulah sebabnya kami memiliki ..

event

mpm_eventsangat mirip dengan pekerja, secara struktural; itu baru saja dipindahkan dari status 'eksperimental' ke 'stabil' di Apache 2.4. Perbedaan besar adalah bahwa ia menggunakan utas khusus untuk menangani koneksi yang tetap hidup, dan menyerahkan permintaan ke utas anak hanya ketika permintaan telah benar-benar dibuat (memungkinkan utas tersebut untuk membackup kembali segera setelah permintaan selesai). Ini bagus untuk konkurensi klien yang tidak selalu aktif pada satu waktu, tetapi membuat permintaan sesekali, dan ketika klien mungkin memiliki batas waktu keep-live yang panjang.

Pengecualian di sini adalah dengan koneksi SSL; dalam hal ini, ia berperilaku identik dengan pekerja (menempelkan koneksi yang diberikan ke utas yang diberikan sampai koneksi ditutup).

Gunakan jika: Anda menggunakan Apache 2.4 dan menyukai utas, tetapi Anda tidak suka utas menunggu koneksi yang menganggur. Semua orang suka utas!

Jangan gunakan jika: Anda tidak menggunakan Apache 2.4, atau Anda perlu prefork untuk kompatibilitas.


Dalam dunia slowloris , AJAX, dan browser saat ini yang suka multiplex 6 koneksi TCP (dengan tetap-hidup, tentu saja) ke server Anda, concurrency adalah faktor penting dalam membuat skala dan skala server Anda dengan baik. Sejarah Apache telah mengikatnya dalam hal ini, dan sementara itu benar-benar masih tidak sebanding dengan orang-orang seperti nginx atau lighttpd dalam hal penggunaan sumber daya atau skala, jelas bahwa tim pengembangan bekerja untuk membangun server web yang masih relevan di dunia konklusi permintaan tinggi saat ini.

Shane Madden
sumber
3
-1: IME, pekerja hanya mengurangi ukuran jejak httpd di wilayah 15% (IIRC Linux melaporkan SAP di RSS yang membuat tampilan pre-fork seolah-olah menggunakan lebih banyak memori daripada yang dilakukannya). Ada perbedaan yang dapat diabaikan antara jejak kernel untuk suatu proses dan utas NPTL. Ini jauh dari kehancuran dunia. Saya tidak mengerti mengapa Anda berpikir bahwa menunggu dan mengalokasikan utas lebih efisien dalam hal penjadwalan daripada menunggu / menjadwalkan proses (pra-bercabang). Atau apa yang membuat Anda berpikir SSL memiliki seluruh kesalahan.
symcbean
9
@symcbean Jadi maksud Anda penggunaan 15% RAM tidak signifikan? Tidak apa-apa, tapi pendapat saya akan sebaliknya. Klaim kinerja konkurensi bukan milik saya. Lihat di sini . Dan perbedaan SSL dijabarkan dengan jelas dalam dokumentasi untuk acara MPM: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
3
@ShaneMadden `dan sementara itu benar-benar masih tidak sesuai dengan orang-orang seperti nginx atau lighttpd dalam hal penggunaan sumber daya atau skala` Saya sudah punya apache floor kedua sistem tersebut.
Kelly Elton
@ShaneMadden sehubungan dengan masalah dengan SSL dan acara MPM: Apakah Anda tahu jika nginx menangani ini secara signifikan lebih baik daripada apache?
DASKAjA
Tampaknya jika Anda mengkompilasi apache 2.4 tanpa mengetahui tentang modul mpm ia datang dengan modul bernama event mpm module dan ia bekerja dengan mod_php7 (saat ini saya sedang meneliti mpm karena apache2.4 melebihi batas koneksi mysql sementara apache 2.2 dengan server mysql yang sama adalah tidak)
BioHazard
8

Berikut ini penjelasan yang bagus tentang cara kerjanya dengan gif:

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

Secara singkat: jika Anda menggunakan 2.4 dan Anda memerlukan httpd sebagai proxy terbalik (dispatcher) maka pilihan Anda adalah MPM Peristiwa

Yura
sumber
Bahkan jika kita menggunakan SSL? Saya menggunakan apache sebagai proxy dan enabler SSL di situs web non-SSL.
bokan
@bokan sepertinya ya, ini yang terbaik, tapi bagaimanapun proxying terbatas untuk SSL
Yura
Wow ~ Posting blog jauh lebih baik daripada jawaban yang diterima, dan gifnya luar biasa! Terima kasih sss. Anda menyelamatkan hari saya.
Rick
6

Pada Februari 2018, dokumentasi Apache 2.4 untuk Acara MPM menyatakan bahwa menggunakan Apache sebagai proksi akan menjaga "penanganan koneksi yang ditingkatkan" sejak 2.4.24 agar tidak berfungsi sebagaimana dirancang. Lihat bagian Keterbatasan .

Masalahnya adalah, sebagai proksi, pekerja tidak dapat mengetahui di mana akhir respons, dan akan dipaksa untuk menunggu sampai seluruh respons terlihat sebelum mengembalikan kontrol ke pendengar.

Untuk alasan ini, tampaknya menggunakan model Worker mungkin yang terbaik untuk saat apache digunakan sebagai proksi. Tidak terlalu jelas bagi saya jika ada keuntungan untuk model acara di lingkungan proxy, tapi mungkin ada.

Dan atau
sumber
5

Sebagian besar tergantung pada modul Apache yang ingin Anda gunakan. Saya pikir pekerja pada umumnya merupakan pilihan default, tetapi beberapa modul (yang lebih tua) memerlukan forking dan bergantung pada prefork.

Jika Anda tidak memiliki preferensi, saya sarankan Anda pergi dengan ketergantungan yang disukai dari distribusi OS Anda. Ubuntu misalnya akan secara default menginstal mpm-pekerja ketika Anda menginstal Apache2.

Jeroen
sumber