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/