Contexte :

Nous partirons de deux systèmes de base sous CentOS 6 installé.
L’un avec NGINX et Apache d’installé et configuré, l’autre aura l’injecteur de tests. Il n’y a pas eu d’optimisation sur Apache et NGINX.

Schéma du Lab :

Lab tests de perf

Installation de l’injecteur :

Nous ferons nos tests avec l’outils ab (Apache Bench)

sudo yum install httpd-tools

Page de tests :

Sur la VM hébergeant les services Web :

Apache

Edition du fichier /var/www/html/index.html

<html>
<head>
<title>First Page</title>
</head>
<body>
Welcome foo !
</body>
</html>

NGINX

Edition du fichier /usr/share/nginx/html/index.html

<html>
<head>
<title>First Page</title>
</head>
<body>
Welcome foo !
</body>
</html>

Tests de performances Apache

Démarrer Apache

Sur la VM hébergeant les services Web :

sudo service httpd start

Note : en fonction de la configuration du serveur hébergeant Apache et NGINX, il est peut être necessaire de stop NGINX avant.

Tests de performances

Sur l’injecteur :

ab -n 30000 -c 30 http://192.168.5.40/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.5.40 (be patient)
Completed 3000 requests
Completed 6000 requests
Completed 9000 requests
Completed 12000 requests
Completed 15000 requests
Completed 18000 requests
Completed 21000 requests
Completed 24000 requests
Completed 27000 requests
Completed 30000 requests
Finished 30000 requests


Server Software:        Apache/2.2.15
Server Hostname:        192.168.5.40
Server Port:            80

Document Path:          /
Document Length:        85 bytes

Concurrency Level:      30
Time taken for tests:   21.949 seconds
Complete requests:      30000
Failed requests:        0
Write errors:           0
Total transferred:      10530000 bytes
HTML transferred:       2550000 bytes
Requests per second:    1366.79 [#/sec] (mean)
Time per request:       21.949 [ms] (mean)
Time per request:       0.732 [ms] (mean, across all concurrent requests)
Transfer rate:          468.50 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1  16.3      0    1004
Processing:     1   21  32.3     15     419
Waiting:        0   15  12.0     14     392
Total:          1   22  36.1     15    1021

Percentage of the requests served within a certain time (ms)
  50%     15
  66%     17
  75%     18
  80%     19
  90%     21
  95%     46
  98%    164
  99%    192
 100%   1021 (longest request)

Note :

  • -n : nombre de requêtes total à envoyer
  • -c : nombre de requêtes parallèle

Notes 2 :

  • La commande est à lancer plusieurs fois pour avoir une moyenne dans les résultats.
  • Il est interessant de monitorer la CPU/Mémoire/Réseau sur les différents éléments de la chaîne traversée (serveurs, switchs, routeurs, load-balancers, firewalls, …), car c’est peut être l’un d’entre eux qui limite les performances.

Tests de performances NGINX

Démarrer NGINX

Sur la VM hébergeant les services Web :

sudo service httpd stop
sudo service nginx start

Tests de performances

Sur l’injecteur :

ab -n 30000 -c 30 http://192.168.5.40/

iThis is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.5.40 (be patient)


Server Software:        nginx/1.8.0
Server Hostname:        192.168.5.40
Server Port:            80

Document Path:          /
Document Length:        85 bytes

Concurrency Level:      30
Time taken for tests:   20.294 seconds
Complete requests:      30000
Failed requests:        0
Write errors:           0
Total transferred:      9452835 bytes
HTML transferred:       2550765 bytes
Requests per second:    1478.25 [#/sec] (mean)
Time per request:       20.294 [ms] (mean)
Time per request:       0.676 [ms] (mean, across all concurrent requests)
Transfer rate:          454.87 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    7 179.3      3    7131
Processing:     4   13 136.7      9    7153
Waiting:        3   12 136.8      8    7150
Total:          8   20 225.8     12    7165

Percentage of the requests served within a certain time (ms)
  50%     12
  66%     13
  75%     13
  80%     15
  90%     17
  95%     18
  98%     20
  99%     22
 100%   7165 (longest request)

Résumé

Temps d'execution Req/s Temps moy req/s Log brute
Test Apache 1 38.619s 776.81 1.287ms log
Apache 2 25.620s 1170.95 0.854ms log
Apache 3 22.545s 1330.64 0.752ms log
Apache 4 24.935s 1203.14 0.831ms log
NGINX 1 20.294s 1478.25 0.676ms log
NGINX 2 13.062s 2296.78 0.435ms log
NGINX 3 22.505s 1333.02 0.750ms log
NGINX 4 22.600s 1327.45 0.753ms log

On peut noter que le plus mauvais temps de NGINX et équivalent au meilleur temps Apache.
Il pourrait être interessant de refaire des tests avec PHP et MySQL pour voir les différents tests.