scalability seagate dockstar

Je pratique depuis longtemps l'autohébergement pour ce blog. La performance, la montée en charge des serveurs font partie de mes passions. J'ai réalisé plusieurs articles sur la performance des sites web, qui devient un élément important pour la SEO des sites web. Je vous propose une étude de la performance du serveur web Nginx, sur le Seagate Dockstar dans le cadre de l'auto hébergement.

Quelles sont les métriques pour caractériser la performance, la capacité de montée en charge d'un serveur web ?

Performance d'un site web

La performance pure, va surtout se caractériser par le capacité pour la chaîne de génération de pages web, à mettre à disposition le plus rapidement possible une page web à l'utilisateur qui en fait le demande. Dans mon article Vitesse d'affichage de site web améliorée, j'ai montré, comment un outil comme WebPageTest (http://www.webpagetest.org), permettait de connaitre les performances d'affichage d'une page, dans le navigateur web. Cette outil prend en compte la vitesse d'obtention des différents éléments qui composent la page web (javascript,css,image,html,...)

Montée en charge de Nginx

Maintenant, pour analyser la capacité de montée en charge d'un serveur web, il faut un outil pour réaliser plusieurs requêtes en parallèles, pour simuler les connexions des utilisateurs, afin de générer des statistiques de temps de réponse. Il existe plusieurs outils, entre autre, le très connu ab, apache benchmark, mais celui-ci ne demande que la partie html de la page web et pas la page dans son ensemble ...

Après quelques recherches, j'ai trouvé un site excellent, qui simule plusieurs utilisateurs en simultané, qui télécharge les composants de la page web dans leur ensemble, puis, qui fournit les statistiques de connexion : Load Impact.

Statistique de la montée en charge de Nginx sur le DockStar

load impact nginx

Sur le site Load Impact, on peut avec le compte gratuit, simuler successivement, 10, 20, 30, 40 et 50 utilisateurs simultanés. Ce qui compte-tenu de l'objectif de mon blog et de nombreux sites web est plus que suffisant ... Globalement, je suis impressionné par les performances du serveur web, qui je le rappelle, est auto-hébergé sur mon ADSL, sur un serveur Seagate DockStar équipé d'un processeur ARM, équivalent à ceux que l'on trouve dans les smartphones. De 10 à 30 utilisateurs, les temps de téléchargement sont linéaires, et plus que corrects avec un temps de téléchargement inférieur à 5 sec pour 30 utilisateurs simultanés. Ensuite, il y a un gros décrochage !

Analyse de la montée en charge de Nginx

Pour analyser la montée en charge du serveur web Nginx sur Seagate DockStar, j'ai utilisé RRDtool, qui stocke les données, et réalise ensuite les graphiques. Pour cette analyse, j'ai pris en compte 3 métriques de performance :

  • la charge CPU du serveur Seagate DockStar
  • la charge réseau du serveur web Seagate DockStar
  • le nombre de requêtes par seconde de Nginx
Pour cela, j'ai réalisé un script bash, pour alimenter la base de données de RRD.

Les statistiques du serveur Nginx sont disponibles en pointant cette url : http://127.0.0.1/nginx_status. Pour les activer, il faut ajouter dans le fichier de configuration sur serveur web Nginx les éléments suivants :

location /nginx_status {
        stub_status on;
        access_log   off;
        allow 127.0.0.1;
        deny all;
        }

Le script bash de collecte des données :

#!/bin/bash

rrdtool=/usr/bin/rrdtool
db1=~/rrd/db/cpu.rrd
db2=~/rrd/db/memory.rrd
db3=~/rrd/db/network.rrd
db4=~/rrd/db/requests.rrd
img=graph
if=eth0
url=http://127.0.0.1/nginx_status

if [ ! -e $db1 ]
then   
        $rrdtool create $db1 --step 15\
        DS:user:COUNTER:30:0:100 \
        DS:nice:COUNTER:30:0:100 \
        DS:system:COUNTER:30:0:100 \
        DS:idle:COUNTER:30:0:100 \
        RRA:AVERAGE:0.5:1:576 \
        RRA:AVERAGE:0.5:6:672 \
        RRA:AVERAGE:0.5:24:732 \
        RRA:AVERAGE:0.5:144:1460
fi
if [ ! -e $db2 ]
then   
        $rrdtool create $db2 --step 15\
        DS:used:GAUGE:30:0:U \
        DS:free:GAUGE:30:0:U \
        DS:buffer:GAUGE:30:0:U \
        DS:cached:GAUGE:30:0:U \
        DS:swap:GAUGE:30:0:U \
        RRA:AVERAGE:0.5:1:576 \
        RRA:AVERAGE:0.5:6:672 \
        RRA:AVERAGE:0.5:24:732 \
        RRA:AVERAGE:0.5:144:1460
fi
if [ ! -e $db3 ]
then   
        $rrdtool create $db3 --step 15\
        DS:in:DERIVE:30:0:12500000 \
        DS:out:DERIVE:30:0:12500000 \
        RRA:AVERAGE:0.5:1:576 \
        RRA:AVERAGE:0.5:6:672 \
        RRA:AVERAGE:0.5:24:732 \
        RRA:AVERAGE:0.5:144:1460
fi
if [ ! -e $db4 ]
then   
        $rrdtool create $db4 --step 15\
        DS:requests:DERIVE:30:0:50000000000 \
        RRA:AVERAGE:0.5:1:576 \
        RRA:AVERAGE:0.5:6:672 \
        RRA:AVERAGE:0.5:24:732 \
        RRA:AVERAGE:0.5:144:1460
fi


cpu=(`cat /proc/stat | grep '^cpu '`)
$rrdtool update $db1 -t user:nice:system:idle N:${cpu[1]}:${cpu[2]}:${cpu[3]}:${cpu[4]}
output=`awk '
    /^MemTotal:/    {total=$2*1024}
    /^MemFree:/     {free=$2*1024}
    /^Buffers:/     {buffer=$2*1024}
    /^Cached:/      {cached=$2*1024}
    /^SwapTotal:/   {swaptotal=$2*1024}
    /^SwapFree:/    {swapfree=$2*1024}
    END {
        used=total-free
        swap=swaptotal-swapfree
        print used ":" free ":" buffer ":" cached ":" swap
    }' /proc/meminfo`
$rrdtool update $db2 -t used:free:buffer:cached:swap N:$output
$rrdtool update $db3 -t in:out N:`/sbin/ifconfig $if |grep bytes|cut -d":" -f2|cut -d" " -f1`:`/sbin/ifconfig $if |grep bytes|cut -d":" -f3|cut -d" " -f1`
$rrdtool update $db4 -t requests N:`wget -qO- $url |head -3|tail -1|cut -d' ' -f4`

Le script exécuté par un cron toutes les 5 secondes. Voici les courbes de cette montée en charge du couple Nginx / Seagate DockStar:

CPU Load Nginx DockStar

On voit nettement, la corrélation entre le nombre de connexions et la charge CPU du processeur ARM. A 30 utilisateurs en simultané, le pourcentage d'utilisation du processeur par Nginx est au environs de 85%, au delà, la CPU culmine à 100%.

Network load Nginx Seagate DockStar

Le débit montant de l'ADSL est limité à 114ko/sec ( =914/8 ). Le graphe montre bien que débit plafonne à 90ko/sec pour les tests avec 40 et 50 utilisateurs. Ce serait donc la CPU qui limiterait les performances du serveur !

ADSL Bandwidth Nginx requests/sec

On voit nettement que dans la configuration actuelle, mon serveur Nginx sur le Seagate DockStar est capable de traiter au maximum 24 requêtes par seconde.

Il est a noter que le poids de ma page d'accueil lors de ce test était de 180ko, 91ko générés par le serveur proprement dit et le reste en provenance des CDNs.

Extrapolation des statistiques de performance Nginx/DockStar

Si on considère comme maximum acceptable, un temps d'accès à l'ensemble de la page web de 2.17 secondes, on peut donc considérer que nos 10 utilisateurs seront "servis" en 2.17 x 10 = 21.7 sec ... Ramené à 12 heures cela représente au minimum 1990 visiteurs unique (3600/21.7)*12 ... Je précise au minimum, car comme mon cache est bien réglé, les utilisateurs qui sont déjà venus, ne rechargent pas l'ensemble de la page ! Donc, pas besoin de lien 100Mb/sec, pas besoin de Xeon 6 cores, pour héberger la plupart des petits blogs (moins de 3000 visiteurs/jours) ! ET VIVE LE GREEN-IT :p