Meninjau kembali kinerja kerangka kerja Python untuk pengembangan web

Baru-baru ini saya harus memulai proyek untuk layanan web baru, dan saya memutuskan untuk menguji kapasitas muat maksimum Django, dan pada saat yang sama membandingkannya dengan Flask dan AIOHTTP. Hasilnya tampak tidak terduga bagi saya, jadi saya akan "meninggalkannya" di sini.



Diagram di bawah menunjukkan hasil dari Apache Benchmark paling sederhana untuk kerangka kerja Django versi 3.1, Flask 1.1 dan AIOHTTP 3.7. AIOHTTP berjalan dalam mode asynchronous single-threaded "biasa", Django dan Flask dilayani oleh server WSGI sinkron Gunicorn dengan jumlah thread sama dengan jumlah inti prosesor yang tersedia * 2. ASGI tidak berpartisipasi dalam pengujian.



Kondisi pengujian
PostgreSQL. :



SELECT r.id, r.auth_user_id, r.status, r.updated, r.label, r.content, u.username,
    ARRAY_AGG(t.tag) tag, COUNT(*) OVER() cnt,
    (
        SELECT COUNT(*) FROM record r2
            WHERE
                r2.parent_id IS NOT NULL
                AND r2.parent_id = r.id
                AND r2.status = 'new'
    ) AS parts
FROM record r
JOIN auth_user u ON u.id = r.auth_user_id
LEFT JOIN tag t ON t.kind_id = r.id AND t.kind = 'rec'
WHERE r.parent_id IS NULL AND r.status = 'new'
GROUP BY r.id, u.username
ORDER BY r.updated DESC
LIMIT 10 OFFSET 0

      
      





, , , .



AIOHTTP asyncpg, Django Flask — SQLAlchemy ORM ( ) psycopg2.



Django (django-admin startproject, manage.py startapp . .), ListView. Flask AIOHTTP «Hello, world», .



Hasil dari menjalankan tes pada mesin lokal (4 inti CPU):







UPD: seperti yang ditulis dengan benar di komentar, untuk perbandingan yang jujur, Anda harus menjalankan AIOHTTP di belakang Gunicorn, atau mengurangi jumlah pekerja menjadi 1.



Tes yang sama pada VDS prosesor tunggal yang nyata (ping sekitar 45 ms):







Selama pengujian, AIOHTTP menggunakan 100% dari satu inti CPU, Flask dan Django - 100% dari semua inti yang tersedia.



kesimpulan



Faktanya, membandingkan aplikasi asynchronous dan multithreaded tidak sepenuhnya benar - keduanya memecahkan masalah yang berbeda. Oleh karena itu, hasilnya tampak cukup logis: dalam pengujian lokal, AIOHTTP hanya memiliki sumber daya yang lebih sedikit, dalam kondisi yang sama, kinerja diratakan.



Tetapi hasil sederhana dari Flask sulit untuk dijelaskan, saya gagal untuk "mengoverclock" kerangka kerja ini.



All Articles