bench Nginx, de 1.4.2 à 1.9.5, options http/2 thread aio et spdy

Depuis que j’utilise NginX, j’ai toujours gardé les binaires compilés de Nginx sur ma machine.

Aujourd’hui, je me fais un plaisir, reprendre chacun de ces binaires, et les tester sur mon portail phpmynewsletter, portail qui fonctionne avec du SSL, une HHVM avec un fallback en php-fpm. (Donc sur un serveur en production !)

Concernant http/2, je vous conseille l’excellente doc de Daniel Stenberg, ingénieur réseaux chez Mozilla : http://daniel.haxx.se/http2/http2-v1.8.pdf. (Autres lecures conseillées :
https://fr.wikipedia.org/wiki/SPDY
https://http2.github.io/)

Pour le protocole d’essai, je vais utiliser wrk, dépôt et explications sur Github dont l’installation est très simple, et que je préfère largement à ab de apache2-utils. J’utilise également un portail qui est réellement en production (au lieu d’utiliser un portail en localhost, ce qui explique des chiffres que l’on peut trouver bas, mais qui ont au moins le mérite de se rapprocher de ce que vous pourrez avoir, vous, en réel. Le matériel est un core i5, 16 go de Ram, et une partition sur un disque en raid mirroré, donc pas de raid 0. Enfin, le moteur PHP derrière tout ça est une HHVM).

Je détaillerai pour chaque test la config par le simple résultat de la commande « nginx -V », et chaque test sera déroulé 5 fois. Je ne posterai que le meilleur résultat de chaque bench.

Chaque wrk sera lancé selon la commande :

Qui signifie : 12 threads, 400 connexions ouvertes pendant 30 secondes.

Tout d’abord, on installe wrk, super simple, en root :
Sur Debian (moi 7,xx, noyau 2.6.xx) :

 

Juste pour info sur CentOS / RedHat et Defora :

 

Les configurations de chacun des Nginx testés :

Nginx 1.4.2 :

 

Nginx 1.6.0 :

 

Nginx 1.9.4 avec spdy, ssl 1.0.2d (dernière version de Nginx disponible avec spdy, à partir de Nginx 1.9.5, spdy est replacé par http/2) :

 

Nginx 1.9.5 sans thread aio, http/2, ssl 1.0.1e :

 

Nginx 1.9.5 avec thread aio, avec http/2, ssl 1.0.1e :

 

Nginx 1.9.5 avec thread aio, avec http/2, ssl 1.0.2d :

 

 

Les résultats :

Nginx 1.4.2 sans spdy, ssl 1.0.1e :

A noter, 51 connexions en Time Out…

Nginx 1.6.0 sans spdy, ssl 1.0.1e

Ouch !!! 1400 requêtes exécutées en moins et 80 timeout en plus (je vais avoir un oeil qui va tomber…)

Je n’ai pas utilisé la V1.7.1, qui a pourtant bonne réputation, d’autres sujets étaient sur le feu (désolé, on priorise parfois !), donc je suis passé à la v1.9.3…

Nginx 1.9.3 sans spdy, ssl 1.0.1e :

Je respire ! Nombre de requêtes encore en baisse à 27700, mais par contre une meilleure gestion des timeout (qui étaient dues à Nginx, les modules php ayant été pour l’occasion poussés à 300 secondes de timeout). Donc un taux de 100% de réponses assurées, et quand on est webmaster, administrateur, ça, c’est VRAIMENT important ! Sic !!!

Nginx 1.9.4 avec spdy, ssl 1.0.2d :

On repasse au dessus des 30.000 requêtes exécutées pour arriver à 33.000, 1110 requêtes secondes… Bien, suis content !

On passe aux choses sérieuses. La version 1.9.5 de Nginx abandonne le mode spdy au profit de 2 nouvelles choses importantes : http/2 et thread_pool (attention, c’est un module encore expérimental qui reste à utiliser avec modération… Je laisserai un mot sur quelques bugs rencontrés à ce sujet).

Nginx 1.9.5 sans http/2, sans thread_pool, ssl 1.0.1e :

De bonnes performances, on est encore au dessus de 30.000 requêtes, mais plus de spdy, et toujours pas de http/2 activé, ni thread_pool… Voyons la suite, activons http/2…

Nginx 1.9.5 avec http/2 activé, sans thread_pool, ssl 1.0.1e :

A noter pour mieux comprendre : je rappelle que le serveur est un serveur de production, c’est à dire qu’il tourne en conditions réelles, avec des vrais sites dessus (dont une grosse base de données cinéma), que le protocole http/2 est une fonctionnalité offerte par certains navigateurs : (source : https://www.keycdn.com/blog/keycdn-http2-support/ du 6 octobre 2015)
caniuse-http2-browser-supportJe rappelle aussi que Nginx 1.9.5 avec le module http/2 est censé être compilé avec openssl 1.0.2, alors que ce dernier exemple de bench est avec un openssl en 1.0.1 (des conséquences ?).
J’ai également constaté un bug… Lors de mon authentification sur le forum de Phpmynewsletter.com, je suis sans cesse envoyé sur une page 403, et une erreur de connexion, sur Chrome Version 45.0.2454.101 m, alors que j’ai un résultat tout à fait correct sur Firefox 41.0.1. Un autre bug : des soucis avec des uploads de fichiers volumineux (dossier de presse cinéma) sur le portail cinéma… Pas top ça…
Et en conclusion : que le protocole http/2 ne peut donc pas donner de résulats probants avec un appel via wrk (ou curl, wget, ab ou quoi que ce soit !)

Enfin bon, donc l’avant dernier test, avec le pool thread_aio… :

On est pas mal… Plus de 31.000 requêtes, pas de timeout… Je veux voir la différence avec le dernier test…

Nginx 1.9.5 avec thread aio, avec http/2, ssl 1.0.2d :

Conclusion…

Que dire ?....

Que penser de tout cela ?…..

Nginx évolue, gère mieux les time out et sert mieux donc toutes les connexions. Le serveur utilisé n’est pas neutre, d’autres process tournent ! Il ne fallait non plus s’attendre à des chiffres de folie, je le savais. Ce que je crois, c’est que dans son ensemble le serveur physique et la gestion des processus sont arrivés aux limites de ce qu’ils peuvent donner à Nginx.

La vue usager est par contre plus intéressante : les pages s’affichent quasi instantanément, plus d’attente de chargement qui d’un objet qui attend sur le précédent qui attend sur le précédent, etc… Tout s’affiche d’un bloc.

Oui, mais alors… Les GTMetrix et autres sites de tests de chargement des pages ?
Et bien ils ne sont pas encore près aux tests http/2, ils retombent donc dans l’usage d’un navigateur commun, ordinaire,…ancien !

La seule chose qui compte, ne l’oubliez jamais : c’est l’usage et le confort de vos usagers, visteurs, membres, etc… Sur votre ou vos sites hébergés ainsi.

On aurait pu pousser le test avec usage différencié de php5-fpm et hhvm, ajouter ou pas du memcache et autres modules de tunning de vos php. Je ne l’ai pas fait, c’est totalement volontaire !

Je suis très content des résultats, tout simplement !

Allez, @+