Slide 1

Slide 1 text

Performance des frameworks web Ronan Amicel @amicel PyCon FR — 25 octobre 2014 — Lyon Python vs The World v1.1

Slide 2

Slide 2 text

Ronan Amicel Fondateur @ Pocket Sensei Hacker en résidence @ The Family

Slide 3

Slide 3 text

Préambule

Slide 4

Slide 4 text

Rapide != Meilleur

Slide 5

Slide 5 text

Lies, damn lies, and… benchmarks

Slide 6

Slide 6 text

Les données :
 benchmarks TechEmpower • http://www.techempower.com/benchmarks/ • https://github.com/TechEmpower/ FrameworkBenchmarks

Slide 7

Slide 7 text

Historique • Round 1 : mars 2013 • Rounds 2 et 3 : avril 2013 • Rounds 4 et 5 : mai 2013 • Round 6 : juillet 2013 • Round 7 : octobre 2013 • Round 8 : décembre 2013 • Round 9 : mai 2014

Slide 8

Slide 8 text

Beaucoup de données 93 6 3 frameworks types de tests plateformes matérielles

Slide 9

Slide 9 text

Méthodologie

Slide 10

Slide 10 text

Les types de tests 1. Texte brut 2. Sérialisation JSON 3. Requête simple 4. Requêtes multiples 5. Mise à jour de données 6. Fortunes

Slide 11

Slide 11 text

1) Texte brut • Réponse “Hello, World!” • Content-type: “text/plain”

Slide 12

Slide 12 text

2) Sérialisation JSON • Instancier un objet trivial (dictionnaire) • Sérialiser l’objet en JSON

Slide 13

Slide 13 text

3) Requête simple • Utiliser l’ORM du framework pour récupérer une ligne au hasard dans une table de la base de données qui en contient 10 000 • Sérialiser le résultat en JSON

Slide 14

Slide 14 text

4) Requêtes multiples • Décoder un paramètre d’URL qui précise le nombre de lignes aléatoires à récupérer • Utiliser l’ORM du framework pour récupérer N lignes au hasard dans une table de la base de données qui en contient 10 000 • Sérialiser la liste de résultats en JSON

Slide 15

Slide 15 text

5) Mise à jour de données • Variation du test n°2 • Utiliser l’ORM pour récupérer une ligne au hasard dans une table qui en contient 10 000 • Modifier un des champs de l’objet • Utiliser l’ORM pour enregistrer l’objet modifié • Sérialiser l’objet modifié en JSON

Slide 16

Slide 16 text

6) Fortunes • Utiliser l’ORM du framework pour récupérer toutes les lignes d’une table de la base de données contenant un nombre arbitraire de messages (fortune cookies) • Insérer un nouveau message dans cette liste • Trier les messages par ordre alphabétique • Générer une page HTML de résultat avec le système de templating du framework

Slide 17

Slide 17 text

3 machines Serveur
 d’application Générateur
 de charge Base
 de données

Slide 18

Slide 18 text

Les plateformes matérielles 1. EC2 • instances Amazon Web Services “m1.large” • réseau Ethernet Gigabit 2. i7 • stations de travail Intel Core i7-2600K (Sandy Bridge) avec 8 Go RAM • réseau Ethernet Gigabit 3. Peak • serveurs 2 x Xeon E5-2660 v2 (Ivy Bridge EP) avec 32 Go RAM • réseau Ethernet 10-gigabit

Slide 19

Slide 19 text

Résultats

Slide 20

Slide 20 text

Python vs Python

Slide 21

Slide 21 text

Frameworks Python Plateforme : Peak – Python 2 – Gunicorn Requêtes / seconde 0 20 000 40 000 60 000 80 000 100 000 Texte brut JSON 9 015 14 120 14 894 16 883 18 912 23 559 27 064 46 842 49 181 50 783 57 571 65 456 71 139 wsgi falcon bottle tornado flask pyramid django

Slide 22

Slide 22 text

Frameworks Python Plateforme : Peak – Python 2 – Gunicorn Requêtes / seconde 0 5 000 10 000 15 000 20 000 Requête simple 3 849 4 154 4 457 4 771 8 696 9 339 15 986 bottle-raw tornado flask-raw bottle pyramid django flask

Slide 23

Slide 23 text

Frameworks Python Plateforme : Peak – Python 2 – Gunicorn Requêtes / seconde 0 500 1 000 1 500 2 000 2 500 3 000 Requête multiples 400 405 419 512 707 2 200 2 561 bottle-raw flask-raw tornado django bottle flask pyramid

Slide 24

Slide 24 text

Frameworks Python Plateforme : Peak – Python 2 – Gunicorn Requêtes / seconde 0 1 500 3 000 4 500 6 000 7 500 9 000 Fortunes 2 009 3 035 3 315 3 475 5 840 8 740 bottle-raw flask-raw pyramid bottle flask django

Slide 25

Slide 25 text

Python 2 vs Python 3 Fortunes / Peak bottle flask pyramid django Requêtes / seconde 7 196 8 865 10 486 11 541 7 428 10 229 11 592 12 662 Python 2 Python 3 -8,9% -9,5% -13,3% -3,1%

Slide 26

Slide 26 text

Python 2 vs PyPy Fortunes / Peak / Gunicorn / MySQL flask-raw bottle flask Requêtes / seconde 6 598 8 694 9 400 11 592 12 662 22 936 Python 2 PyPy -59% -31% -43%

Slide 27

Slide 27 text

Python vs The World

Slide 28

Slide 28 text

Ruby

Slide 29

Slide 29 text

Tests bas niveau
 WSGI vs Rack Peak Requêtes / seconde 0 50 000 100 000 150 000 200 000 250 000 300 000 Texte Brut JSON 114 466 131 659 220 602 251 501 WSGI Rack

Slide 30

Slide 30 text

Microframeworks Peak Requêtes / seconde 0 50 000 100 000 150 000 200 000 Texte brut JSON 23 092 30 541 114 466 131 659 60 065 66 463 159 153 172 662 220 602 251 501 WSGI Bottle Flask Rack Sinatra

Slide 31

Slide 31 text

Microframeworks + ORM Peak Requêtes / seconde 0 5 000 10 000 15 000 20 000 Requête simple Requête multiples 79 1 003 1 111 15 158 1 196 19 329 Bottle Flask Sinatra

Slide 32

Slide 32 text

Et Rails ? Peak Requêtes / seconde 0 2 500 5 000 7 500 10 000 12 500 15 000 Fortunes 2 729 7 428 10 229 11 592 12 662 bottle flask pyramid django rails

Slide 33

Slide 33 text

Django vs Rails Peak Requêtes / seconde 0 3 500 7 000 10 500 14 000 JSON Requête simple Requête multiples Mises à jour Fortunes 2 729 279 580 4 032 6 091 7 428 818 1 801 10 685 12 082 Django Rails

Slide 34

Slide 34 text

PHP

Slide 35

Slide 35 text

Python vs PHP Fortunes / Peak php-raw yaf-raw phalcon-micro bottle-raw phalcon phpixie bottle flask pyramid django symfony2 Requêtes / seconde 0 25 000 50 000 75 000 100 000 8 023 10 229 11 592 12 662 33 283 544 13 050 16 720 42 754 58 015 97 508

Slide 36

Slide 36 text

Node.js

Slide 37

Slide 37 text

Python vs Node.js Plateforme : i7 / MongoDB Requêtes / seconde 0 20 000 40 000 60 000 80 000 100 000 Texte brut JSON Requête simple Requête multiples 3 325 25 729 69 563 73 401 707 9 339 23 559 27 064 Tornado Node.js

Slide 38

Slide 38 text

PyPy vs Node.js Plateforme : i7 / MongoDB Requêtes / seconde 0 25 000 50 000 75 000 100 000 Texte brut JSON Requête simple Requête multiples 1 473 25 774 84 517 94 068 3 325 25 729 69 563 73 401 707 9 339 23 559 27 064 Tornado Node.js Tornado + PyPy

Slide 39

Slide 39 text

Java

Slide 40

Slide 40 text

Python vs Java Fortunes / Peak gemini servlet-raw undertow grizzly-jersey bottle-raw wicket grails bottle flask pyramid spring django activeweb Requêtes / seconde 0 25 000 50 000 75 000 100 000 125 000 150 000 175 000 7 428 10 229 11 592 12 662 33 283 3 759 9 997 14 585 24 914 44 879 107 704 159 178 166 103

Slide 41

Slide 41 text

Questions ?

Slide 42

Slide 42 text

Merci !