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)

1 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

1 <html>
2 <head>
3 <title>First Page</title>
4 </head>
5 <body>
6 Welcome foo !
7 </body>
8 </html>

NGINX

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

1 <html>
2 <head>
3 <title>First Page</title>
4 </head>
5 <body>
6 Welcome foo !
7 </body>
8 </html>

Tests de performances Apache

Démarrer Apache

Sur la VM hébergeant les services Web :

1 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 :

 1 ab -n 30000 -c 30 http://192.168.5.40/
 2 
 3 This is ApacheBench, Version 2.3 <$Revision: 655654 $>
 4 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
 5 Licensed to The Apache Software Foundation, http://www.apache.org/
 6 
 7 Benchmarking 192.168.5.40 (be patient)
 8 Completed 3000 requests
 9 Completed 6000 requests
10 Completed 9000 requests
11 Completed 12000 requests
12 Completed 15000 requests
13 Completed 18000 requests
14 Completed 21000 requests
15 Completed 24000 requests
16 Completed 27000 requests
17 Completed 30000 requests
18 Finished 30000 requests
19 
20 
21 Server Software:        Apache/2.2.15
22 Server Hostname:        192.168.5.40
23 Server Port:            80
24 
25 Document Path:          /
26 Document Length:        85 bytes
27 
28 Concurrency Level:      30
29 Time taken for tests:   21.949 seconds
30 Complete requests:      30000
31 Failed requests:        0
32 Write errors:           0
33 Total transferred:      10530000 bytes
34 HTML transferred:       2550000 bytes
35 Requests per second:    1366.79 [#/sec] (mean)
36 Time per request:       21.949 [ms] (mean)
37 Time per request:       0.732 [ms] (mean, across all concurrent requests)
38 Transfer rate:          468.50 [Kbytes/sec] received
39 
40 Connection Times (ms)
41               min  mean[+/-sd] median   max
42 Connect:        0    1  16.3      0    1004
43 Processing:     1   21  32.3     15     419
44 Waiting:        0   15  12.0     14     392
45 Total:          1   22  36.1     15    1021
46 
47 Percentage of the requests served within a certain time (ms)
48   50%     15
49   66%     17
50   75%     18
51   80%     19
52   90%     21
53   95%     46
54   98%    164
55   99%    192
56  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 :

1 sudo service httpd stop
2 sudo service nginx start

Tests de performances

Sur l'injecteur :

 1 ab -n 30000 -c 30 http://192.168.5.40/
 2 
 3 iThis is ApacheBench, Version 2.3 <$Revision: 655654 $>
 4 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
 5 Licensed to The Apache Software Foundation, http://www.apache.org/
 6 
 7 Benchmarking 192.168.5.40 (be patient)
 8 
 9 
10 Server Software:        nginx/1.8.0
11 Server Hostname:        192.168.5.40
12 Server Port:            80
13 
14 Document Path:          /
15 Document Length:        85 bytes
16 
17 Concurrency Level:      30
18 Time taken for tests:   20.294 seconds
19 Complete requests:      30000
20 Failed requests:        0
21 Write errors:           0
22 Total transferred:      9452835 bytes
23 HTML transferred:       2550765 bytes
24 Requests per second:    1478.25 [#/sec] (mean)
25 Time per request:       20.294 [ms] (mean)
26 Time per request:       0.676 [ms] (mean, across all concurrent requests)
27 Transfer rate:          454.87 [Kbytes/sec] received
28 
29 Connection Times (ms)
30               min  mean[+/-sd] median   max
31 Connect:        0    7 179.3      3    7131
32 Processing:     4   13 136.7      9    7153
33 Waiting:        3   12 136.8      8    7150
34 Total:          8   20 225.8     12    7165
35 
36 Percentage of the requests served within a certain time (ms)
37   50%     12
38   66%     13
39   75%     13
40   80%     15
41   90%     17
42   95%     18
43   98%     20
44   99%     22
45  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.