Apache Vs Nginx, on nous aurait menti ?

1/52/53/54/55/5 (2 votes, moyenne: 2,00 sur 5)
Loading...
A

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 :

benchmark-apache-vs-nginx-firebug

 

 

Un screenshot de la page :

benchmark-apache-vs-nginx-screen

 

 

 

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 :

benchmark-apache-vs-nginx-03

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 :

benchmark-apache-vs-nginx-04

 

 

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 …

 

 

A propos de l'auteur

Nicolas Simond

Ingénieur Systèmes et Réseaux et guitariste hard rock et metal à mes heures perdues.
Je suis le créateur et l'unique rédacteur d'Abyss Project, c'est ici que je note la plupart de mes procédures et quelques divagations.

Si vous l'article vous a aidé, pensez à me payer un café :)

Subscribe
Notify of
guest

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

0 Commentaires
Inline Feedbacks
View all comments