Artikel ini adalah terjemahan dari artikel Kevin Goldberg "Analisis Kinerja Server WSGI Python: Bagian 2" dzone.com/articles/a-performance-analysis-of-python-wsgi-servers-part dengan beberapa tambahan dari penerjemah.
Pendahuluan
Pada bagian
pertama dari seri ini, Anda bertemu dengan
WSGI dan enam server paling populer menurut penulis
WSGI . Di bagian ini, Anda akan ditunjukkan hasil menganalisis kinerja server ini. Untuk tujuan ini, kotak pasir uji khusus telah dibuat.
Kontestan
Karena keterbatasan waktu, penelitian dibatasi pada enam server WSGI. Semua instruksi startup untuk proyek ini di
-host di GitHub . Mungkin seiring waktu, proyek akan meluas dan analisis kinerja untuk server WSGI lainnya akan disajikan. Tetapi untuk sekarang, kita akan berbicara tentang enam server:
- Bjoern menggambarkan dirinya sebagai "server WSGI sangat cepat" dan membanggakan bahwa itu adalah "server WSGI tercepat, terkecil dan teringan". Kami membuat aplikasi kecil yang menggunakan sebagian besar pengaturan perpustakaan default.
- CherryPy adalah kerangka kerja dan WSGI server yang sangat populer dan stabil. Script kecil ini digunakan untuk melayani aplikasi sampel kami melalui CherryPy .
- Gunicorn terinspirasi oleh server Unicorn Ruby (karena itu namanya). Dia dengan sederhana mengklaim bahwa itu "sederhana diimplementasikan, mudah digunakan dan cukup cepat." Tidak seperti Bjoern dan CherryPy , Gunicorn adalah server mandiri. Kami membuatnya menggunakan perintah ini . Parameter "WORKER_COUNT" disetel menjadi dua kali lipat jumlah inti prosesor yang tersedia, ditambah satu. Ini dilakukan berdasarkan rekomendasi dari dokumentasi Gunicorn .
- Meinheld adalah server web kompatibel-WSGI berkinerja tinggi yang mengklaim ringan. Berdasarkan contoh yang ditampilkan di situs server, kami membuat aplikasi kami .
- mod_wsgi dibuat oleh pencipta yang sama dengan mod_python . Seperti mod_python , itu hanya tersedia untuk Apache. Namun, itu termasuk alat yang disebut "mod_wsgi express" yang menciptakan contoh Apache sekecil mungkin. Kami mengkonfigurasi dan menggunakan mod_wsgi express dengan perintah ini . Untuk mencocokkan Gunicorn , kami menyetel mod_wsgi untuk membuat pekerja dua kali lebih banyak dari inti prosesor.
- uWSGI adalah server aplikasi berfitur lengkap. Biasanya, uWSGI dipasangkan dengan server proxy (misalnya: Nginx). Namun, untuk mengevaluasi kinerja masing-masing server dengan lebih baik, kami mencoba menggunakan hanya server kosong dan menciptakan dua pekerja untuk setiap inti prosesor yang tersedia.
Tolok ukur
Untuk membuat pengujian seobjektif mungkin, sebuah wadah
Docker dibuat untuk mengisolasi server yang sedang diuji dari sisa sistem. Juga, penggunaan wadah Docker memastikan bahwa setiap peluncuran dimulai dari awal.
Server:
- Terisolasi dalam wadah buruh pelabuhan.
- 2 inti prosesor dialokasikan.
- RAM kontainer dibatasi hingga 512 MB.
Pengujian:
- wrk , alat pembandingan HTTP modern, menjalankan pengujian.
- Server diuji secara acak dengan peningkatan jumlah koneksi simultan dalam kisaran 100 hingga 10.000.
- wrk terbatas pada dua core CPU yang tidak digunakan oleh Docker.
- Setiap tes berlangsung 30 detik dan diulang 4 kali.
Metrik:
- Jumlah rata-rata permintaan terus-menerus, kesalahan, dan penundaan disediakan oleh wrk .
- Dibangun pada Docker, pemantauan menunjukkan tingkat penggunaan CPU dan RAM.
- Bacaan tertinggi dan terendah dibuang, dan nilai-nilai yang tersisa rata-rata.
- Untuk yang penasaran, kami mengirim skrip lengkap ke GitHub .
Hasil
Semua indikator kinerja awal
dimasukkan dalam repositori proyek , dan ringkasan
file CSV juga disediakan. Juga, untuk visualisasi, grafik dibuat di lingkungan
Google-doc .
RPS versus jumlah koneksi simultan
Grafik ini menunjukkan jumlah rata-rata permintaan bersamaan; Semakin tinggi angkanya, semakin baik.


- Bjoern: Pemenang yang jelas.
- CherryPy: Meskipun ditulis dengan Python murni, ia adalah pemain terbaik.
- Meinheld: Kinerja luar biasa mengingat sumber daya wadah yang langka.
- mod_wsgi: Bukan yang tercepat, tetapi kinerjanya konsisten dan memadai.
- Gunicorn: Performa bagus di beban lebih rendah, tetapi ada pertarungan dengan sejumlah besar koneksi.
- uWSGI: Frustrasi dengan hasil yang buruk.
PEMENANG: BjoernBjoern
Dengan jumlah permintaan konstan,
Bjoern adalah pemenang yang jelas. Namun, mengingat jumlahnya jauh lebih tinggi daripada pesaing, kami agak skeptis. Kami tidak yakin bahwa
Bjoern sangat cepat. Awalnya kami menguji server berdasarkan abjad, dan kami berpikir bahwa
Bjoern mendapatkan keuntungan yang tidak adil. Namun, bahkan setelah memulai server dalam urutan dan pengujian ulang server acak, hasilnya tetap sama.
uWSGI
Kami kecewa dengan hasil
uWSGI yang lemah. Kami berharap dia memimpin. Selama pengujian, kami memperhatikan bahwa log
uWSGI dicetak di layar, dan pada awalnya kami menjelaskan kurangnya kinerja dengan pekerjaan tambahan yang dilakukan server. Namun, bahkan setelah opsi “
--disable-logging ” ditambahkan,
uWSGI masih merupakan server yang paling lambat.
Seperti disebutkan dalam manual
uWSGI , biasanya antarmuka dengan server proxy seperti Nginx. Namun, kami tidak yakin ini dapat menjelaskan perbedaan yang begitu besar.
Tunda
Keterlambatan adalah jumlah waktu yang berlalu antara permintaan dan tanggapannya. Angka yang lebih rendah lebih baik.

- CherryPy: Menangani muatan dengan baik.
- Bjoern: Umumnya latensi rendah, tetapi berfungsi lebih baik dengan koneksi konkurensi lebih sedikit.
- Gunicorn: baik dan konsisten.
- mod_wsgi: Performa rata-rata, bahkan dengan sejumlah besar koneksi simultan.
- Meinheld: Secara keseluruhan, kinerja yang dapat diterima.
- uWSGI: uWSGI lagi di tempat terakhir.
PEMENANG: CherryPyPenggunaan RAM
Metrik ini menunjukkan persyaratan memori dan "cahaya" dari setiap server. Angka yang lebih rendah lebih baik.

- Bjoern: Sangat ringan. Hanya menggunakan 9 MB RAM untuk memproses 10.000 permintaan bersamaan.
- Meinheld: Sama seperti Bjoern .
- Gunicorn: Dengan terampil mengatasi beban tinggi dengan konsumsi memori yang nyaris tidak terlihat.
- CherryPy: Awalnya membutuhkan sejumlah kecil RAM, tetapi penggunaannya meningkat pesat dengan meningkatnya beban.
- mod_wsgi: Pada level yang lebih rendah, itu adalah salah satu yang paling kuat di memori, tetapi tetap cukup konsisten.
- uWSGI: Jelas, versi yang kami uji memiliki masalah dengan jumlah memori yang dikonsumsi.
PEMENANG: Bjoern dan MeinheldJumlah kesalahan
Kesalahan terjadi ketika server crash, terganggu, atau permintaan habis. Semakin rendah semakin baik.

Untuk setiap server, kami menghitung rasio total rasio jumlah permintaan terhadap jumlah kesalahan:
- CherryPy: tingkat kesalahan sekitar 0, bahkan dengan jumlah koneksi yang tinggi.
- Bjoern: Terjadi kesalahan, tetapi ini diimbangi dengan jumlah permintaan yang diproses.
- mod_wsgi: Bekerja dengan baik dengan tingkat kesalahan 6% yang dapat diterima.
- Gunicorn: Bekerja dengan tingkat kesalahan 9 persen.
- uWSGI: Mengingat rendahnya jumlah permintaan yang dilayani, itu berakhir dengan tingkat kesalahan 34 persen.
- Meinheld: Jatuh pada beban yang lebih tinggi, melemparkan lebih dari 10.000 kesalahan selama tes yang paling menuntut.
PEMENANG: CherryPyPenggunaan CPU
Pemanfaatan CPU yang tinggi tidak baik atau buruk jika server bekerja dengan baik. Namun, ini memberikan beberapa informasi menarik tentang server. Karena dua core CPU digunakan, penggunaan maksimum yang mungkin adalah 200 persen.

- Bjoern: server berulir tunggal, sebagaimana dibuktikan dengan penggunaan CPU 100% yang konsisten.
- CherryPy: multithreaded, tetapi macet di 150 persen. Ini mungkin karena Python GIL .
- Gunicorn: menggunakan beberapa proses dengan penggunaan penuh sumber daya CPU di tingkat yang lebih rendah.
- Meinheld: Server berulir tunggal menggunakan sumber daya CPU seperti Bjoern.
- mod_wsgi: Server multi-utas menggunakan semua inti CPU di seluruh pengukuran
- uWSGI: penggunaan CPU sangat rendah. Konsumsi CPU tidak melebihi 50 persen. Ini adalah salah satu bukti bahwa uWSGI tidak dikonfigurasi dengan benar.
WINNER: Tidak, karena ini lebih merupakan pengamatan dalam perilaku daripada perbandingan dalam kinerja.Kesimpulan
Untuk meringkas! Berikut adalah beberapa ide umum yang dapat Anda ambil dari hasil setiap server:
- Bjoern: Membenarkan dirinya sebagai "server WSGI super cepat, ultra-ringan."
- CherryPy: Kinerja tinggi, konsumsi memori rendah dan tingkat kesalahan rendah. Tidak buruk untuk Python murni.
- Gunicorn: Server yang bagus untuk beban sedang.
- Meinheld: Bekerja dengan baik dan membutuhkan sumber daya minimal. Namun, berjuang dengan beban yang lebih tinggi.
- mod_wsgi: Terintegrasi dengan Apache dan berfungsi dengan baik.
- uWSGI: Sangat kecewa. Entah kami salah mengonfigurasi uWSGI , atau versi yang kami pasang memiliki kesalahan mendasar.