Yang menginstal: Apache Worker atau Prefork? Apa kelebihan (dis-) dari masing-masing?

55

Berdasarkan deskripsi untuk Prefork dan Worker MPM, sepertinya tipe prefork agak ketinggalan jaman, tetapi saya tidak dapat menemukan perbandingan yang tepat dari kedua tipe tersebut.

Apa yang ingin saya ketahui:

  • Apa perbedaan antara kedua versi?
  • Apa kelebihan (dis-) dari setiap jenis server?
  • Apakah ada pedoman dasar tentang jenis mana yang harus dipilih berdasarkan kondisi?
  • Apakah ada perbedaan kinerja yang besar di antara keduanya?
Aron Rotteveel
sumber

Jawaban:

40

Seperti yang dikatakan oleh dokumen, Anda harus menggunakan MPM prefork jika Anda perlu menghindari threading untuk kompatibilitas dengan pustaka non-thread-safe. Biasanya, setiap modul Apache non-sepele ( mod_php- atau, lebih tepatnya, banyak sekali ekstensi dan pustaka yang ditautkannya - menjadi contoh kanonik) memiliki semacam pustaka non-utas-aman (atau memiliki non-utas- kode aman di dalamnya), jadi kecuali jika Anda menggunakan menginstal Apache cukup stok, saya akan pergi untuk MPM prefork.

womble
sumber
3
Saya akan merekomendasikan MPM pekerja, kecuali jika Anda menjalankan PHP. Pekerja adalah MPM yang disarankan dari apache, dan memberikan kinerja yang lebih baik dan overhead yang lebih rendah. Hanya saja pengembang PHP belum pernah mendengar tentang keamanan utas yang Anda butuhkan untuk menggunakan prefork.
David Pashley
16
PHP telah aman untuk waktu yang sangat lama. Mereka hanya menyarankan penggunaan pra-forker karena mereka tidak dapat mengontrol apa yang dilakukan perpustakaan lain. Berhenti menyalahkan PHP untuk kelambanan pengembang lainnya.
Alister Bulman
3
PHP mungkin aman utas (walaupun saya ragu) tetapi semua perpustakaan yang terhubung pasti tidak. Di sini kami menjalankan beberapa aplikasi PHP yang cukup besar dan setiap beberapa bulan kami mencoba untuk beralih dari prefork ke pekerja, tetapi kami langsung mendapatkan data yang rusak.
Aleksandar Ivanisevic
5
Setidaknya fungsi mengubah variabel ENV tidak akan menjadi thread aman, setlocal php.net/manual/en/function.setlocale.php adalah contoh umum dari itu.
radius
4
Satu catatan: Masalah-masalah ini tidak berlaku jika PHP dilampirkan misalnya dengan php-fpmvia FastCGI. Maka MPM pekerja baik-baik saja - maka fpm akan menjalankan setiap permintaan PHP dalam proses sendiri sementara Apache dapat menjalankan threaded. Masalah keamanan PHP-Thread hanya mencegah Anda menggunakan mod_php, yang menjalankan PHP di dalam proses Apache.
mschuett
13

Solusi klasik untuk menjalankan ekstensi tidak aman sambil melayani koneksi konkurensi dalam jumlah besar (> 100) adalah menjalankan PHP pada fastCGI (mod_fcgid, modul apache asli) dan permintaan dinamis proksi untuk itu dari instance apache yang menjalankan MPM Pekerja.

Ini akan memungkinkan Anda untuk menskala dari beberapa ratus hingga> 1000 koneksi bersamaan dengan jumlah memori yang sederhana (4 ~ 8GB) saat menyajikan campuran konten statis dan dinamis.

Tentu saja, Anda juga harus menyelidiki solusi caching front-end sebagai bagian dari penerapan Anda secara keseluruhan (memcached, varnish).

Atau, tingkatkan ke apache 2.4 dan MPM acara aslinya , yang menangani konkurensi dengan cara yang jauh lebih baik (utas terputus saat tersambung, tidak menunggu untuk disurvei.)

adaptr
sumber
dapatkah Anda memperluas pada komentar acara mpm? Bagaimana cara menumpuk vs pekerja mpm?
Sirex
Sementara MPM pekerja sudah berbasiskan benang, dan karenanya jauh lebih cepat untuk memulai dan lebih ringan untuk dijalankan, acara MPM tidak lagi melakukan pemungutan suara soket - ia mendapat pemberitahuan tentang aktivitas; oleh karena itu, "acara".
adaptr
jadi itu harus bekerja lebih baik di situs dengan traffic tinggi (13 k / dtk)?
Sirex
6

Sudah sekitar 3 tahun sejak pertanyaan diposting tetapi saya akan merekomendasikan Anda pergi dengan MPM pekerja daripada pra-garpu bahkan jika menggunakan PHP, untuk mendapatkan kinerja yang lebih baik.

Mengenai perbedaannya, pre-fork adalah non-threaded maka server melakukan fork proses untuk setiap permintaan klien (pre-fork untuk mengantisipasi permintaan baru sehingga forking tidak memakan waktu respon). Karena permintaan adalah server dalam proses terpisah, ini biasanya membebani memori dan CPU Anda lebih banyak. Pekerja membawa multi-threading yang lebih ringan dan memiliki pemanfaatan memori yang lebih baik.

aleemb
sumber
2

Ini adalah sesuatu yang sangat khusus untuk apa yang Anda layani. Jika Anda melakukan banyak koneksi statis kecil, utas akan lebih ringan dan lebih cepat. Jika Anda hanya memiliki beberapa aplikasi besar yang terus-menerus muncul, prefork mungkin memiliki keunggulan karena kematangan dan stabilitasnya. Mengapa tidak mengatur apa yang Anda butuhkan, uji satu, tukar modul MPM, coba lagi, lihat mana yang lebih cocok untuk Anda?

Marcin
sumber
Anda tidak dapat secara sewenang-wenang "menukar" MPM di apache 2.2; sudah diatur pada waktu kompilasi.
adapttr
Anda bisa dengan apt atau RPM. Debian memiliki beberapa paket Apache 2 yang berbeda, tergantung pada gaya yang Anda inginkan.
Brendan Byrd
1

yang perlu pada jenis dan jenis lalu lintas yang akan Anda miliki. Dan juga pertama-tama Anda harus memahami perbedaan utama antara prefork dan pekerja. Semoga artikel di bawah ini akan membantu Anda mencari tahu! http://slashroot.in/how-is-nginx-different-from-apache

sarath
sumber
2
Kami lebih suka jawaban memiliki konten, bukan tautan ke konten. Jika Anda bisa memberikan ringkasan tentang apa yang ada di tautan-target, itu adalah praktik terbaik. Tautan-busuk terjadi.
sysadmin1138
1
Pertanyaannya adalah tentang Apache (nginx bukan apache) dan manfaat relatif dari prefork atau utas (nginx tidak menggunakan keduanya)
symcbean