jMeter est lourd à mettre en œuvre et complexe. A la place j’ai trouvé des petits outils plus simples, mais très puissants et scriptables en ligne de commande.
Locust.io qui permet de faire des tests de performances et Taurus qui permet d’aller plus loin avec des tests de scalabilité.
Installation de Locust
apt-get install python-pip python-dev && pip install locustio
Création du fichier locustfile.py qui indique les scénarios à tester. Ici on teste la HP, puis le login, puis l’accès à la page /node/add/request qui est un formulaire important sur ce site :
from locust import HttpLocust, TaskSet def login(l): l.client.post("/user", {"name":"admin", "pass":"admin", "form_id":"user_login"}) def index(l): l.client.get("/") def create_request(l): l.client.get("/node/add/request") class UserBehavior(TaskSet): tasks = {index:2, create_request:1} def on_start(self): login(self) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000
Ensuite on lance le serveur :
locust --host=http://10.0.2.2:8088/emh/www/
Les résultats donnent quelque chose comme ceci :
On peut grâce au lien « Edit » en dessous de status faire facilement varier le nombre de clients et le nombre de répétitions des tests pour simuler une montée en charge. Il suffit ensuite de surveiller l’apparition des #fails pour déterminer le seuil de scalabilité.
Installation de taurus
Taurus est un complément à Locust.io : il permet de planifier l’exécution d’une montée en charge de manière très précise de manière à surveiller exactement ou se situent les seuils qui font « exploser » votre site. En complément on pourra installer un système de monitoring du serveur comme le stack TICK par exemple qui permettra d’avoir des métriques précises sur le maillon faible du serveur.
Quelques pré-requis
pip install --upgrade pip && pip install --upgrade requests && apt-get install python-dev libxml2-dev libxslt1-dev zlib1g-dev && pip install bzt
Création d’un fichier de test: emh_test.yml
--- execution: - executor: locust concurrency: 10 ramp-up: 1m hold-for: 3m iterations: 1000 scenario: example scenarios: example: default-address: http://emh.box.local script: locustfile.py reporting: - final_stats - console
Pour obtenir les résultats il faut lancer le serveur :
bzt emh_test.yml
Et maintenant, dernière petite amélioration. On va lancer plusieurs scénarios en différé en rajoutant dans le fichier de configuration :
- executor: locust concurrency: 10 ramp-up: 1m hold-for: 2m iterations: 1000 scenario: example delay: 1m - executor: locust concurrency: 10 ramp-up: 1m hold-for: 1m iterations: 1000 scenario: example delay: 2m