


Fahami Gunicorn dan Python GIL dalam satu artikel
Apakah Python GIL, cara ia berfungsi dan cara ia mempengaruhi gunicorn.
Jenis pekerja Gunicorn yang manakah harus saya pilih untuk persekitaran pengeluaran?
Python mempunyai kunci global (GIL) yang hanya membenarkan satu utas dijalankan (iaitu mentafsir kod bait). Pada pendapat saya, memahami cara Python mengendalikan concurrency adalah penting jika anda ingin mengoptimumkan perkhidmatan Python anda.
Python dan gunicorn memberi anda cara yang berbeza untuk mengendalikan konkurensi, dan memandangkan tiada peluru ajaib yang merangkumi semua kes penggunaan, adalah lebih baik untuk memahami pilihan, tukar ganti dan kelebihan setiap pilihan.
Jenis pekerja Gunicorn
Gunicorn mendedahkan pilihan berbeza ini di bawah konsep "jenis pekerja". Setiap jenis sesuai untuk set kes penggunaan tertentu.
- segerakkan——Membuat proses menjadi N proses berjalan selari untuk mengendalikan permintaan.
- gthread——Janakan N urutan untuk menyampaikan permintaan secara serentak.
- eventlet/gevent - menjana benang hijau untuk menyampaikan permintaan serentak.
Pekerja penyegerakan Gunicorn
Ini adalah jenis pekerjaan yang paling mudah di mana satu-satunya pilihan serentak ialah memotong proses N yang akan melayani permintaan secara selari.
Ia boleh berfungsi dengan baik, tetapi menanggung banyak overhed (seperti memori dan penukaran konteks CPU), dan jika kebanyakan masa permintaan anda menunggu I/O, penskalaan Sex ialah teruk.
Gunicorn gthread worker
gthread worker menambah baik perkara ini dengan membenarkan anda membuat N thread setiap proses. Ini meningkatkan prestasi I/O kerana anda boleh menjalankan lebih banyak contoh kod anda secara serentak. Ini adalah satu-satunya daripada empat yang terjejas oleh GIL.
Gunicorn eventlet dan pekerja gevent
eventlet/gevent pekerja cuba menambah baik lagi model gthread dengan menjalankan utas pengguna yang ringan (aka benang hijau, greenlet, dll.).
Ini membolehkan anda memiliki beribu-ribu greenlet tersebut pada kos yang sangat kecil berbanding dengan rangkaian sistem. Perbezaan lain ialah model ini mengikuti model kerja kolaboratif dan bukannya preemptive, membenarkan kerja tanpa gangguan sehingga ia disekat. Kami mula-mula akan menganalisis kelakuan benang pekerja gthread semasa memproses permintaan dan cara ia dipengaruhi oleh GIL.
Tidak seperti penyegerakan di mana setiap permintaan disampaikan secara langsung oleh satu proses, dengan gthread, setiap proses mempunyai N urutan untuk penskalaan yang lebih baik tanpa menimbulkan berbilang proses overhed. Memandangkan anda menjalankan berbilang benang dalam proses yang sama, GIL akan menghalangnya daripada berjalan secara selari.
GIL bukanlah satu proses atau benang khas. Ia hanyalah pembolehubah boolean yang aksesnya dilindungi oleh mutex, yang memastikan bahawa hanya satu utas berjalan dalam setiap proses. Bagaimana ia berfungsi boleh dilihat pada gambar di atas. Dalam contoh ini kita dapat melihat bahawa kita mempunyai 2 utas sistem berjalan serentak, setiap utas mengendalikan 1 permintaan. Prosesnya adalah seperti ini:
- Thread A memegang GIL dan mula melayani permintaan.
- Selepas beberapa ketika, benang B cuba menyampaikan permintaan tetapi tidak dapat menahan GIL.
- B Tetapkan tamat masa untuk memaksa GIL dilepaskan jika ini tidak berlaku sebelum tamat masa dicapai.
- A tidak akan melepaskan GIL sehingga tamat masa dicapai.
- B menetapkan bendera gil_drop_request untuk memaksa A melepaskan GIL serta-merta.
- A melepaskan GIL dan akan menunggu sehingga benang lain merebut GIL, untuk mengelakkan situasi di mana A akan terus melepaskan dan merebut GIL tanpa benang lain dapat merebutnya.
- B mula berlari.
- B melepaskan GIL sambil menyekat I/O.
- A mula berlari.
- B cuba berlari semula tetapi dijeda.
- A selesai sebelum tamat masa dicapai.
- B sedang berjalan.
Senario yang sama tetapi menggunakan gevent
Pilihan lain untuk meningkatkan konkurensi tanpa menggunakan proses ialah menggunakan greenlets. Pekerja ini menghasilkan "benang pengguna" dan bukannya "benang sistem" untuk meningkatkan serentak.
Walaupun ini bermakna mereka tidak terjejas oleh GIL, ini juga bermakna anda masih tidak boleh meningkatkan selari kerana ia tidak boleh dijadualkan selari oleh CPU.
- Greenlet A akan mula berjalan sehingga acara I/O berlaku atau pelaksanaan selesai.
- Greenlet B akan menunggu sehingga Greenlet A mengeluarkan gelung acara.
- A tamat.
- B bermula.
- B melepaskan gelung acara untuk menunggu I/O.
- B selesai.
Untuk kes ini, adalah jelas bahawa mempunyai pekerja jenis greenlet adalah tidak ideal. Kami akhirnya mempunyai permintaan kedua menunggu sehingga permintaan pertama selesai dan kemudian melahu menunggu I/O sekali lagi.
Model kerjasama greenlet benar-benar bersinar dalam senario ini kerana anda tidak membuang masa pada suis konteks dan mengelakkan overhed menjalankan berbilang rangkaian sistem.
Kami akan menyaksikan ini dalam ujian penanda aras pada akhir artikel ini. Sekarang, ini menimbulkan persoalan berikut:
- Adakah menukar tamat masa suis konteks benang menjejaskan kependaman dan daya pemprosesan perkhidmatan?
- Cara memilih antara gevent/eventlet dan gthread apabila anda mencampurkan kerja I/O dan CPU.
- Cara memilih bilangan utas menggunakan gthread worker.
- Adakah saya perlu menggunakan pekerja penyegerakan sahaja dan menambah bilangan proses bercabang untuk mengelakkan GIL?
Untuk menjawab soalan ini, anda perlu memantau untuk mengumpulkan metrik yang diperlukan dan kemudian menjalankan penanda aras yang disesuaikan terhadap metrik yang sama tersebut. Tiada guna menjalankan penanda aras sintetik yang mempunyai korelasi sifar dengan corak penggunaan sebenar anda. Graf di bawah menunjukkan kependaman dan metrik daya pemprosesan untuk senario yang berbeza untuk memberi anda gambaran tentang cara semuanya berfungsi bersama.
Menanda aras selang penukaran GIL
Di sini kita dapat melihat cara menukar selang penukaran/tamat masa penukaran benang GIL mempengaruhi kependaman permintaan. Seperti yang dijangkakan, kependaman IO menjadi lebih baik apabila selang pensuisan berkurangan. Ini berlaku kerana utas terikat CPU terpaksa melepaskan GIL dengan lebih kerap dan membenarkan utas lain menyelesaikan kerja mereka.
Tetapi ini bukan ubat penawar. Mengurangkan selang suis akan menjadikan benang terikat CPU mengambil masa lebih lama untuk disiapkan. Kita juga boleh melihat peningkatan dalam kependaman keseluruhan dan pengurangan dalam tamat masa disebabkan peningkatan overhed penukaran benang berterusan. Jika anda ingin mencuba sendiri, anda boleh menukar selang penukaran menggunakan kod berikut:
Menanda aras gthread lwn. kependaman gevent menggunakan permintaan terikat CPU
Secara keseluruhannya, kami dapat melihat bahawa penanda aras mencerminkan gerak hati kami daripada analisis kami sebelum ini tentang cara benang dan greenlet terikat GIL berfungsi.
Gthread mempunyai kependaman purata yang lebih baik untuk permintaan terikat IO disebabkan oleh pertukaran selang yang memaksa benang berjalan lama dilepaskan.
permintaan terikat CPU gevent mempunyai kependaman yang lebih baik daripada gthread kerana ia tidak terganggu untuk memberi perkhidmatan kepada permintaan lain.
Menanda aras gthread lwn. gevent throughput menggunakan permintaan terikat CPU
Hasil di sini juga mencerminkan perbandingan gevent vs. gthread Intuisi kami sebelum ini untuk lebih baik daya pengeluaran. Penanda aras ini sangat bergantung pada jenis kerja yang dilakukan dan mungkin tidak semestinya diterjemahkan terus kepada kes penggunaan anda.
Matlamat utama penanda aras ini adalah untuk memberi anda sedikit panduan tentang perkara yang perlu diuji dan diukur untuk memaksimumkan setiap teras CPU yang akan melayani permintaan.
Memandangkan semua pekerja gunicorn membenarkan anda menentukan bilangan proses yang akan dijalankan, apa yang berubah ialah cara setiap proses mengendalikan sambungan serentak. Oleh itu, pastikan anda menggunakan bilangan pekerja yang sama untuk menjadikan ujian itu adil. Sekarang mari cuba jawab soalan sebelumnya menggunakan data yang dikumpul daripada penanda aras kami.
Adakah menukar tamat masa suis konteks benang menjejaskan kependaman dan daya pemprosesan perkhidmatan?
Itu benar. Walau bagaimanapun, untuk sebahagian besar beban kerja, ini bukan pengubah permainan.
Bagaimana untuk memilih antara gevent/eventlet dan gthread apabila anda bekerja dengan I/O dan CPU bercampur? Seperti yang dapat kita lihat, ghtread cenderung untuk membenarkan keselarasan yang lebih baik apabila anda mempunyai kerja yang lebih intensif CPU.
Bagaimana untuk memilih bilangan utas untuk pekerja gthread?
Selagi penanda aras anda boleh mensimulasikan gelagat seperti pengeluaran, anda akan melihat dengan jelas prestasi puncak dan kemudian ia akan mula merosot kerana terlalu banyak urutan.
Perlukah saya hanya menggunakan pekerja penyegerakan dan menambah bilangan proses bercabang untuk mengelakkan GIL?
Melainkan I/O anda hampir sifar, penskalaan dengan proses sahaja bukanlah pilihan terbaik.
Kesimpulan
Coroutine/Greenlets boleh meningkatkan kecekapan CPU kerana ia mengelakkan gangguan dan suis konteks antara urutan. Coroutines berdagang kependaman untuk pemprosesan.
Coroutine boleh menyebabkan kependaman yang lebih tidak dapat diramalkan jika anda mencampurkan IO dan titik akhir terikat CPU - Titik akhir terikat CPU tidak terganggu untuk melayani permintaan masuk yang lain. Jika anda meluangkan masa untuk mengkonfigurasi gunicorn dengan betul, GIL tidak menjadi masalah.
Atas ialah kandungan terperinci Fahami Gunicorn dan Python GIL dalam satu artikel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP dan Python mempunyai kelebihan dan kekurangan mereka sendiri, dan pilihannya bergantung kepada keperluan projek dan keutamaan peribadi. 1.PHP sesuai untuk pembangunan pesat dan penyelenggaraan aplikasi web berskala besar. 2. Python menguasai bidang sains data dan pembelajaran mesin.

Latihan yang cekap model pytorch pada sistem CentOS memerlukan langkah -langkah, dan artikel ini akan memberikan panduan terperinci. 1. Penyediaan Persekitaran: Pemasangan Python dan Ketergantungan: Sistem CentOS biasanya mempamerkan python, tetapi versi mungkin lebih tua. Adalah disyorkan untuk menggunakan YUM atau DNF untuk memasang Python 3 dan menaik taraf PIP: Sudoyumupdatepython3 (atau SudodnfupdatePython3), pip3install-upgradepip. CUDA dan CUDNN (Percepatan GPU): Jika anda menggunakan Nvidiagpu, anda perlu memasang Cudatool

Docker menggunakan ciri -ciri kernel Linux untuk menyediakan persekitaran berjalan yang cekap dan terpencil. Prinsip kerjanya adalah seperti berikut: 1. Cermin digunakan sebagai templat baca sahaja, yang mengandungi semua yang anda perlukan untuk menjalankan aplikasi; 2. Sistem Fail Kesatuan (Unionfs) menyusun pelbagai sistem fail, hanya menyimpan perbezaan, menjimatkan ruang dan mempercepatkan; 3. Daemon menguruskan cermin dan bekas, dan pelanggan menggunakannya untuk interaksi; 4. Ruang nama dan cgroups melaksanakan pengasingan kontena dan batasan sumber; 5. Pelbagai mod rangkaian menyokong interkoneksi kontena. Hanya dengan memahami konsep -konsep teras ini, anda boleh menggunakan Docker dengan lebih baik.

Membolehkan pecutan GPU pytorch pada sistem CentOS memerlukan pemasangan cuda, cudnn dan GPU versi pytorch. Langkah-langkah berikut akan membimbing anda melalui proses: Pemasangan CUDA dan CUDNN Tentukan keserasian versi CUDA: Gunakan perintah NVIDIA-SMI untuk melihat versi CUDA yang disokong oleh kad grafik NVIDIA anda. Sebagai contoh, kad grafik MX450 anda boleh menyokong CUDA11.1 atau lebih tinggi. Muat turun dan pasang Cudatoolkit: Lawati laman web rasmi Nvidiacudatoolkit dan muat turun dan pasang versi yang sepadan mengikut versi CUDA tertinggi yang disokong oleh kad grafik anda. Pasang Perpustakaan Cudnn:

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Apabila memilih versi pytorch di bawah CentOS, faktor utama berikut perlu dipertimbangkan: 1. Keserasian versi CUDA Sokongan GPU: Jika anda mempunyai NVIDIA GPU dan ingin menggunakan pecutan GPU, anda perlu memilih pytorch yang menyokong versi CUDA yang sepadan. Anda boleh melihat versi CUDA yang disokong dengan menjalankan arahan NVIDIA-SMI. Versi CPU: Jika anda tidak mempunyai GPU atau tidak mahu menggunakan GPU, anda boleh memilih versi CPU PyTorch. 2. Pytorch versi python

Penyimpanan Objek Minio: Penyebaran berprestasi tinggi di bawah CentOS System Minio adalah prestasi tinggi, sistem penyimpanan objek yang diedarkan yang dibangunkan berdasarkan bahasa Go, serasi dengan Amazons3. Ia menyokong pelbagai bahasa pelanggan, termasuk Java, Python, JavaScript, dan GO. Artikel ini akan memperkenalkan pemasangan dan keserasian minio pada sistem CentOS. Keserasian versi CentOS Minio telah disahkan pada pelbagai versi CentOS, termasuk tetapi tidak terhad kepada: CentOS7.9: Menyediakan panduan pemasangan lengkap yang meliputi konfigurasi kluster, penyediaan persekitaran, tetapan fail konfigurasi, pembahagian cakera, dan mini

CentOS Memasang Nginx memerlukan mengikuti langkah-langkah berikut: memasang kebergantungan seperti alat pembangunan, pcre-devel, dan openssl-devel. Muat turun Pakej Kod Sumber Nginx, unzip dan menyusun dan memasangnya, dan tentukan laluan pemasangan sebagai/usr/local/nginx. Buat pengguna Nginx dan kumpulan pengguna dan tetapkan kebenaran. Ubah suai fail konfigurasi nginx.conf, dan konfigurasikan port pendengaran dan nama domain/alamat IP. Mulakan perkhidmatan Nginx. Kesalahan biasa perlu diberi perhatian, seperti isu ketergantungan, konflik pelabuhan, dan kesilapan fail konfigurasi. Pengoptimuman prestasi perlu diselaraskan mengikut keadaan tertentu, seperti menghidupkan cache dan menyesuaikan bilangan proses pekerja.
