Locked History Actions

Bench

Benchmark de serveurs reverse proxy APACHE / VULTURE / ISA SERVEUR 2006





Bastien Barbe INTRINsec 2007

Présentation du test



Dans ce test les reverses proxy suivant sont testés :
- APACHE (avec mod_proxy)
- VULTURE (basé sur APACHE)
- ISA SERVEUR 2006


Dans tous ces produits seule la fonctionnalité "reverse proxy" est testé bien entendu le but de ce test n'est pas de couvrir toutes les fonctionnalités d'ISA Serveur ou d'APACHE ou bien même de VULTURE.

L'objectif de ce benchmark est de mettre en avant les compétences de chacun pour répondre à la fonction de reverse proxy cette benchmark est en aucun cas un comparatif de fonctionnalités.

Outils utilisés pour les tests

Un script SHELL permettant de lancer et configurer tous les outils ci-dessous. Un script PHP utilisant AB l'outil de bench d'APACHE Un script fonctionnant avec SNMP pour récupérer les infos CPU. Un script PHP pour construire les Graphs (JPGRAPH) / généré les CSV Exel pour les graphs CPU.

Ces outils sont disponibles ici : WebBenchMark-0.1B.tar



Configuration matériel commune à tous les tests


La configuration matérielle est strictement identique pour tous les tests

- 3 machines HP DX 2000MT (Intel celeron D avec 512Mo de RAM)

1er machine : Windows 2003 Server / Centos 5 en multi-boot avec APACHE et ISA SERVEUR

2eme machine: Machine utilisé pour lancée les scripts de bench : CENTOS 5 avec PHP5

3eme machine: Serveur WEB utilisé par le reverse proxy : REDHAT Entreprise 5 avec APACHE 2

Déroulement du test

Au cours de cette benchmark, nous allons évaluer à la fois un produit commercial (ISA SERVER) et également un produit open-source APACHE et VULTURE (basé sur APACHE).

Test du serveur APACHE avec mpm WORKER et ensuite PREFORK (LINUX)

Test de VULTURE avec WORKER et PREFORK (LINUX)

Puis test de ISA SERVEUR 2006 (MICROSOFT)

Bench du serveur APACHE

Benchmark APACHE Avec mpm WORKER et mod_proxy

Dans un premier temps, nous allons évalués APACHE avec 2 modes de fonctionnement WORKER et PREFORK, la principale différence entre ces 2 modes et la gestion des processus, pour PREFORK APACHE créé des processus pour répondre aux clients tandis que WORKER est basé sur des threads.

Configuration PREFORK/WORKER

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       5
MinSpareServers    5
MaxSpareServers   12
ServerLimit      250
MaxClients       240
MaxRequestsPerChild 0
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers         5
MaxClients         240
MinSpareThreads      5
MaxSpareThreads     12
ThreadsPerChild     20
MaxRequestsPerChild  0
</IfModule>

Option de compilation d'APACHE pour l'utilisation de mpm worker

Server version: Apache/2.2.4 (Unix)
Server built:   Aug  2 2007 18:47:35
Server's Module Magic Number: 20051115:4
Server loaded:  APR 1.2.8, APR-Util 1.2.8
Compiled using: APR 1.2.8, APR-Util 1.2.8
Architecture:   32-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/var/tmp/INTRINsec-common-root/opt/INTRINsec/httpd"
 -D SUEXEC_BIN="/var/tmp/INTRINsec-common-root/opt/INTRINsec/httpd/bin/suexec"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

Configuration du reverse proxy APACHE

        Listen *:80
        
        NameVirtualHost *:80
        
        <VirtualHost *:80>
                
                ServerName  rproxy.bench.intra
                ProxyRequests Off
                
                <Proxy *>
                        Order deny,allow
                        Allow from all
                </Proxy>
                
                ProxyPass / http://192.168.2.242/
                Proxypassreverse / http://192.168.2.242/
                
                ErrorLog /var/log/httpd/rproxy_error.log
                Customlog /var/log/httpd/rproxy_comb.log combined
                
                logLevel warn
        
        </VirtualHost>


Configuration du script pour le test d'APACHE WORKER

WEBSITE='http://rproxy.bench.intra/';
BENCHMARK_NAME='ApacheWorker';
NB_REQUEST_TO_PERFORM=1000;
CONCURRENT_REQUESTS_INC=10;
CONCURRENT_REQUESTS_MAX=300;
SLEEP_TIME_BETWEEN_TEST=5;

Résultats des tests



Résultats moyen observés pour APACHE WORKER en mode reverse proxy :

Request per second

Time per request

Transfert rate

Cpu Load AVG

292.7 requests

4.8 ms

1223.93 kb/sec

4 %







=== Configuration du script pour le test d'APACHE PREFORK ===

WEBSITE='http://rproxy.bench.intra/';
BENCHMARK_NAME='ApachePrefork';
NB_REQUEST_TO_PERFORM=1000;
CONCURRENT_REQUESTS_INC=10;
CONCURRENT_REQUESTS_MAX=300;
SLEEP_TIME_BETWEEN_TEST=5;

Résultats des tests





Résultats moyen observés pour APACHE PREFORK en mode reverse proxy :

Request per second

Time per request

Transfert rate

Cpu Load AVG

112.47 requests

9.08 ms

465.59 kb/sec

4.58 %











Configuration du script pour le test de VULTURE (avec WORKER)



WEBSITE='http://rproxy.bench.intra/';
BENCHMARK_NAME='VultureWorker';
NB_REQUEST_TO_PERFORM=1000;
CONCURRENT_REQUESTS_INC=10;
CONCURRENT_REQUESTS_MAX=300;
SLEEP_TIME_BETWEEN_TEST=5;

Résultats des tests



Résultats moyen observés pour VULTURE WORKER :

Request per second

Time per request

Transfert rate

Cpu Load AVG

86 requests

13.55 ms

355.13 kb/sec

23 %



Configuration du script pour le test de VULTURE (avec WORKER)



WEBSITE='http://rproxy.bench.intra/';
BENCHMARK_NAME='VultureWorker';
NB_REQUEST_TO_PERFORM=1000;
CONCURRENT_REQUESTS_INC=10;
CONCURRENT_REQUESTS_MAX=300;
SLEEP_TIME_BETWEEN_TEST=5;

Résultats des tests



Résultats moyen observés pour VULTURE WORKER :



Request per second

Time per request

Transfert rate

Cpu Load AVG

86 requests

13.55 ms

355.13 kb/sec

23 %











Option de compilation d'APACHE pour VULTURE mpm worker

[root@benchlinux RPMS]# /opt/INTRINsec/httpd/bin/httpd -V
Server version: Apache/2.2.4 (Unix)
Server built:   Aug 20 2007 13:12:54
Server's Module Magic Number: 20051115:4
Server loaded:  APR 1.2.8, APR-Util 1.2.8
Compiled using: APR 1.2.8, APR-Util 1.2.8
Architecture:   32-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/var/tmp/INTRINsec-common-root/opt/INTRINsec/httpd"
 -D SUEXEC_BIN="/var/tmp/INTRINsec-common-root/opt/INTRINsec/httpd/bin/suexec"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"



Test de VULTURE (PREFORK)


Configuration du script pour le test de VULTURE (PREFORK)


WEBSITE='http://rproxy.bench.intra/';
BENCHMARK_NAME='VulturePrefork';
NB_REQUEST_TO_PERFORM=1000;
CONCURRENT_REQUESTS_INC=10;
CONCURRENT_REQUESTS_MAX=300;
SLEEP_TIME_BETWEEN_TEST=5;


Résultats des tests


Request per second

Time per request

Transfert rate

Cpu Load AVG

111 requests

9 ms

465.59 kb/sec

19 %











Benchmark de ISA Serveur 2006 en mode « reverse proxy »


Dans un premier temps la protection ISA Serveur contre les attaques est désactivé sans quoi ce test ne serait pas possible (protection DOS).

L'application web est rajoutée sous ISA par le biais de l'interface graphique : Dans le menu « stratégie de parefeu», nouveau, règle de publication de site web.

Configuration du script pour le test de ISA


WEBSITE='http://rproxy.bench.intra/';
BENCHMARK_NAME='ISA_SERVER_2006';
NB_REQUEST_TO_PERFORM=1000;
CONCURRENT_REQUESTS_INC=10;
CONCURRENT_REQUESTS_MAX=300;
SLEEP_TIME_BETWEEN_TEST=5;

Resultats

Request per second

Time per request

Transfert rate

Cpu Load AVG

109.97 requests

23.70 ms

762.08 kb/sec

13 %











Comparatifs des 3 solutions de reverse proxy



Reverse proxy Apache avec mpm WORKER



Request per second

Time per request

Transfert rate

CpuLoad AVG

292.7 requests

4.8 ms

1223.93 kb/sec

4 %



Reverse proxy Apache avec mpm PREFORK



Request per second

Time per request

Transfert rate

CpuLoad AVG

112.47 requests

9.08 ms

465.59 kb/sec

4.58 %



Reverse proxy Vulture avec mpm WORKER



Request per second

Time per request

Transfert rate

CpuLoad AVG

86 requests

13.55 ms

355.13 kb/sec

23 %



Reverse proxy Vulture avec mpm PREFORK



Request per second

Time per request

Transfert rate

CpuLoad AVG

111 requests

9 ms

465.59 kb/sec

19 %



Reverse proxy ISA Server 2006



Request per second

Time per request

Transfert rate

Cpu Load AVG

109.97 requests

23.70 ms

762.08 kb/sec

13 %

Conclusion


Les conditions de tests ici sont extrêmes (300 connexion simultanées), et sont quasiment impossible à reproduire dans un environnement de production hormis si le serveur subissait une attaque de type DOS, l'ensemble des produits réagissent bien en terme de gestion du processeur car aucun n'est saturé ou manque de ressources processeur.

Les écarts entre Vulture et Apache s'explique du fait que Vulture utilise du code PERL pour certains traitements et de APACHE utilise quand à lui exclusivement du C, d'autre part Vulture réalise beaucoup plus d'opérations lors de l'arrivé d'une requête HTTP (application des règles mod security et traitement avec les scripts perl).

Le mpm WORKER fonctionne moins bien avec Vulture car il n'est pas optimisé pour utiliser des scripts que ce soit PERL ou PHP (version antérieur 5.1).

Compromis performances / fonctionnalités


Chaque produit présenté ici présente des fonctionnalités qui font leurs valeurs ajoutée, ainsi même si APACHE semble être le plus rapide (et sa conception est pensée pour) ses fonctionnalités sont très ciblées (facilement extensibles avec des modules).

ISA Serveur ici présente pas mal d'atout en terme de performances et de fonctionnalités mais l'ajout de nouvelles fonctionnalités et la personnalisation sont plus difficile que sur un produit comme VULTURE (avantage de l'open source).

Il est donc très difficile de comparer ces 3 produits à moins de restreindre le champ du test comme c'est le cas ici.



Annexe


- L'outil AB utilisé ici dans le script webenchmark : http://httpd.apache.org/docs/2.0/programs/ab.html

- La librairie php jpgraph utilisée ici pour générer les graphs : http://www.aditus.nu/jpgraph/