Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.
Bonjour à tous,
Suite à plusieurs recherches sur le net pour trouver des tests comparants Nginx à Apache, je me suis aperçu que dans absolument tous les tests Nginx permettait de tenir beaucoup plus de requêtes par secondes qu’un Apache.
Le problème de tous ces tests, c’est que le Benchmark est fait soit sur la page par défaut de Nginx/apache, soit sur un phpinfo, ce qui n’est pas relevant.
C’est pourquoi je me suis amusé à monter 2 environnements de tests identiques avec pour seule différente bien sûr soit Nginx, soit Apache version mpm worker installé, c’est le moment d’un duel Apache Vs Nginx !
Pour cela, j’ai décidé d’utiliser une « vrai » application histoire que les tests soit proche de la réalité. J’ai choisi d’utiliser Cmsimple.
J’utilise la page par défaut du cms pour les tests
Versions utilisées :
Les versions utilisées sont les dernières versions stables disponibles dans les dépôts officiels de Debian 7.5.
- Apache2 : 2.2.22-13+deb7u1
- Apache2-mpm-worker : 2.2.22-13+deb7u1
- Nginx : 1.2.1-2.2+wheezy2
- Php5-fpm : 5.4.4-14+deb7u9
- Cmsimple : 4.4.3
Matériel utilisé :
cat /proc/cpuinfo (4 cœurs)
root@debian:~# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 58 model name : Intel(R) Core(TM) i7-3610QM CPU @ 2.30GHz stepping : 9 microcode : 0x19 cpu MHz : 2246.287 cache size : 6144 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 5 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl pni ssse3 lahf_lm bogomips : 4492.57 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management:
cat /proc/meminfo (4Gb @ 1600Mhz)
MemTotal: 4061276 kB MemFree: 2664336 kB Buffers: 88600 kB Cached: 1043872 kB SwapCached: 0 kB Active: 677612 kB Inactive: 553112 kB Active(anon): 98360 kB Inactive(anon): 512 kB Active(file): 579252 kB Inactive(file): 552600 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 477180 kB SwapFree: 477180 kB Dirty: 80 kB Writeback: 0 kB AnonPages: 98268 kB Mapped: 20004 kB Shmem: 612 kB Slab: 120332 kB SReclaimable: 105192 kB SUnreclaim: 15140 kB KernelStack: 1304 kB PageTables: 9388 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2507816 kB Committed_AS: 754480 kB VmallocTotal: 34359738367 kB VmallocUsed: 67880 kB VmallocChunk: 34359669487 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 55232 kB DirectMap2M: 4139008 kB
cat /etc/debian_version && uname -r ( Debian 7.5 AMD64 )
root@debian:~# cat /etc/debian_version && uname -r 7.5 3.2.0-4-amd64
Analyse de la page de benchmark :
Voici une analyse avec Firebug :
Un screenshot de la page :
Configuration de Nginx, Apache2 et php5-fpm :
Les configurations sont de « base ». Elles n’ont pas étés modifiées après l’installation.
Toutefois, le worker process correspond bien à 4 dans Nginx.
Serveur de benchmark :
Le serveur de benchmark est un clone de l’image de base qui a servi à faire les 2 serveurs de test.
Il est juste moins puissant car, il n’a que 2 cœurs et 1 Gb de ram.
Il est sur le même hyperviseur que les serveurs de tests.
L’hyperviseur est virtualbox en version 4.3.12 avec les additions invités.
Les serveurs apache2 et nginx ne sont jamais lancés simultanément.
L’outil utilisé pour le benchmark est SIEGE en version 2.70-3.
Les cartes réseaux sont en accès par pont sur une carte réelle Killer e2200.
Le test :
Voici la commande utilisée :
siege -d5 -r500 -c2000 -t10M
Elle permet de simuler 2000 utilisateurs qui effectueront des requêtes entre toutes les 0 et 5 secondes pendant 10 minutes.
Résultat Apache 2 avec module mpm worker :
siege -d5 -r500 -c2000 -t10M http://192.168.1.15/ [error] CONFIG conflict: selected time and repetition based testing: No such file or directory defaulting to time-based testing: 600 seconds ** SIEGE 2.70 ** Preparing 2000 concurrent users for battle. The server is now under siege... Lifting the server siege... done. Transactions: 399356 hits Availability: 100.00 % Elapsed time: 600.09 secs Data transferred: 1074.39 MB Response time: 0.49 secs Transaction rate: 665.49 trans/sec Throughput: 1.79 MB/sec Concurrency: 327.32 Successful transactions: 399356 Failed transactions: 2 Longest transaction: 16.13 Shortest transaction: 0.00 FILE: /var/log/siege.log You can disable this annoying message by editing the .siegerc file in your home directory; change the directive 'show-logfile' to false. root@debian:/tmp#
Un petit HTOP pendant le test, pile poil à la limite des performances du serveur :
Résultat NGINX :
root@debian:~# siege -d5 -r500 -c2000 -t10M http://lemetal.net/ [error] CONFIG conflict: selected time and repetition based testing: No such file or directory defaulting to time-based testing: 600 seconds ** SIEGE 2.70 ** Preparing 2000 concurrent users for battle. The server is now under siege.. done. siege aborted due to excessive socket failure; you can change the failure threshold in $HOME/.siegerc Transactions: 1139 hits Availability: 33.25 % Elapsed time: 8.96 secs Data transferred: 7.43 MB Response time: 2.05 secs Transaction rate: 127.12 trans/sec Throughput: 0.83 MB/sec Concurrency: 261.10 Successful transactions: 1139 Failed transactions: 2287 Longest transaction: 3.10 Shortest transaction: 0.00 FILE: /var/log/siege.log You can disable this annoying message by editing the .siegerc file in your home directory; change the directive 'show-logfile' to false. root@debian:~# siege -d5 -r500 -c2000 -t10M http://lemetal.net/ [error] CONFIG conflict: selected time and repetition based testing: No such file or directory defaulting to time-based testing: 600 seconds ** SIEGE 2.70 ** Preparing 2000 concurrent users for battle. The server is now under siege.. done. siege aborted due to excessive socket failure; you can change the failure threshold in $HOME/.siegerc Transactions: 1168 hits Availability: 33.66 % Elapsed time: 8.72 secs Data transferred: 7.54 MB Response time: 1.84 secs Transaction rate: 133.94 trans/sec Throughput: 0.87 MB/sec Concurrency: 246.14 Successful transactions: 1168 Failed transactions: 2302 Longest transaction: 2.35 Shortest transaction: 0.00 FILE: /var/log/siege.log You can disable this annoying message by editing the .siegerc file in your home directory; change the directive 'show-logfile' to false. root@debian:~# siege -d5 -r500 -c1000 -t10M http://lemetal.net/ [error] CONFIG conflict: selected time and repetition based testing: No such file or directory defaulting to time-based testing: 600 seconds ** SIEGE 2.70 ** Preparing 1000 concurrent users for battle. The server is now under siege.. done. siege aborted due to excessive socket failure; you can change the failure threshold in $HOME/.siegerc Transactions: 1593 hits Availability: 55.22 % Elapsed time: 11.43 secs Data transferred: 6.98 MB Response time: 0.80 secs Transaction rate: 139.37 trans/sec Throughput: 0.61 MB/sec Concurrency: 112.14 Successful transactions: 1593 Failed transactions: 1292 Longest transaction: 1.26 Shortest transaction: 0.00 FILE: /var/log/siege.log You can disable this annoying message by editing the .siegerc file in your home directory; change the directive 'show-logfile' to false. root@debian:~# siege -d5 -r500 -c500 -t10M http://lemetal.net/ [error] CONFIG conflict: selected time and repetition based testing: No such file or directory defaulting to time-based testing: 600 seconds ** SIEGE 2.70 ** Preparing 500 concurrent users for battle. The server is now under siege.. done. siege aborted due to excessive socket failure; you can change the failure threshold in $HOME/.siegerc Transactions: 54752 hits Availability: 98.14 % Elapsed time: 365.20 secs Data transferred: 161.95 MB Response time: 0.76 secs Transaction rate: 149.92 trans/sec Throughput: 0.44 MB/sec Concurrency: 113.22 Successful transactions: 54752 Failed transactions: 1035 Longest transaction: 1.38 Shortest transaction: 0.00 FILE: /var/log/siege.log You can disable this annoying message by editing the .siegerc file in your home directory; change the directive 'show-logfile' to false. root@debian:~#
Alors là catastrophe ! Quand le soi-disant « lent » apache 2 supporte 665 requêtes par seconde, Nginx n’en supporte que 150 !
Et quand on regarde un HTOP pris avec « seulement » 500 utilisateurs simulés, on voit que le serveur avec Nginx sature :
Bonus, Apache et Reverse Proxy Nginx :
J’ai décidé de mettre Nginx en Reverse Proxy sur mon serveur apache2 avec mpm worker pour voir les résultats aussi :
siege -d5 -r500 -c2000 -t10M http://192.168.1.15/ siege aborted due to excessive socket failure; you can change the failure threshold in $HOME/.siegerc Transactions: 20871 hits Availability: 93.10 % Elapsed time: 73.86 secs Data transferred: 56.19 MB Response time: 1.65 secs Transaction rate: 282.58 trans/sec Throughput: 0.76 MB/sec Concurrency: 467.50 Successful transactions: 20871 Failed transactions: 1548 Longest transaction: 29.62 Shortest transaction: 0.00
On perd en performances en fessant ça.
Conclusion de ce Apache Vs Nginx :
Incroyable non ?
Après une installation de base sur des serveurs clonés à partir de la même image, Apache2 est 4 fois plus véloce que Nginx
Mais avec ce test et le htop, on voit bien que php-fpm ne se comporte pas de la même façon entre les 2 serveurs, ce qui est étrange, le goulot d’étranglement viens de là, mais il n’est pas question de fine tuning dans ce duel Apache Vs Nginx, je veux simplement voir les performances de 2 installations de « base ».
Et a priori, même si Nginx est très fort pour le contenu statique, il a du mal pour le php.
Même en reverse proxy sur du apache2 on perd en performances, je suis plutôt mitigé quand à l’utilisation de Nginx maintenant …