Überprüfung der Leistung von Python-Frameworks für die Webentwicklung

Vor kurzem musste ich ein Projekt eines neuen Webdienstes starten und entschied mich, die maximale Ladekapazität von Django zu testen und gleichzeitig mit Flask und AIOHTTP zu vergleichen. Das Ergebnis schien mir unerwartet, also werde ich es hier "einfach lassen".



Die folgenden Diagramme zeigen die Ergebnisse des einfachsten Apache-Benchmarks für die Django- Frameworks Version 3.1, Flask 1.1 und AIOHTTP 3.7. AIOHTTP wird im "normalen" asynchronen Single-Thread-Modus ausgeführt. Django und Flask werden von einem synchronen WSGI-Server Gunicorn bedient, dessen Anzahl der Threads der Anzahl der verfügbaren Prozessorkerne entspricht. * 2. ASGI hat nicht am Test teilgenommen.



Test-Bedingungen
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», .



Ergebnisse der Ausführung des Tests auf einem lokalen Computer (4 CPU-Kerne):







UPD: Wie in den Kommentaren richtig geschrieben, sollten Sie für einen ehrlichen Vergleich entweder AIOHTTP hinter Gunicorn ausführen oder die Anzahl der Mitarbeiter auf 1 reduzieren.



Der gleiche Test auf einem echten VDS mit einem Prozessor (Ping ist ungefähr 45) ms):







Während des Tests verwendete AIOHTTP 100% eines CPU-Kerns, Flask und Django - 100% aller verfügbaren Kerne.



Schlussfolgerungen



Tatsächlich ist der Vergleich von asynchronen und Multithread-Anwendungen nicht ganz korrekt - sie lösen unterschiedliche Probleme. Daher sieht das Ergebnis ziemlich logisch aus: Im lokalen Test hatte AIOHTTP einfach weniger Ressourcen, unter gleichen Bedingungen wird die Leistung ausgeglichen.



Aber das bescheidene Ergebnis von Flask ist schwer zu erklären, ich konnte diesen Rahmen nicht "übertakten".



All Articles