Développer une application scalable aujourd'hui est à la portée de tous, la tester pour lui faire supporter de 1 à 1 millions d'utilisateur est aussi simple, si on utilise Tsung. Après une présentation générale on entrera dans les arcanes des modules Erlang pour développer des tests de peformance riches en fonctionnalités
1. de 1 à 1 million avec Tsung
Rodolphe Quiédeville
Confoo - Montréal
19 février 2015
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 1 / 59
2. #mylife
Admin/Sys tendance DevOps depuis 20 ans
84000 heures de connections au web
Nourri au logiciel libre exclusivement
Contributeur à Tsung
Formateur auprès de Upstream-University
Responsable Performance chez Novapost / PeopleDoc
Consultant sur les performances des SI(G)
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 2 / 59
3. Qu’est-ce qu’un test de performance ?
charge, volumétrie donnée
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 3 / 59
4. Qu’est-ce qu’un test de performance ?
charge, volumétrie donnée
résistance, au desssus des limites
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 3 / 59
5. Qu’est-ce qu’un test de performance ?
charge, volumétrie donnée
résistance, au desssus des limites
vieillissement, dans 2 mois, dans 5 ans
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 3 / 59
6. Qu’est-ce qu’un test de performance ?
charge, volumétrie donnée
résistance, au desssus des limites
vieillissement, dans 2 mois, dans 5 ans
montée en charge, ouverture des nouveaux marchés
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 3 / 59
7. Qu’est-ce qu’un test de performance ?
charge, volumétrie donnée
résistance, au desssus des limites
vieillissement, dans 2 mois, dans 5 ans
montée en charge, ouverture des nouveaux marchés
Simulation au plus près du réel des conditions d’exploitation d’un
système.
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 3 / 59
8. Ce n’est pas
!= test unitaire
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 4 / 59
9. Ce n’est pas
!= test unitaire
!= test fonctionnel
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 5 / 59
10. Ce n’est pas
!= test unitaire
!= test fonctionnel
!= test de conformité
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 6 / 59
11. Ce n’est pas
!= test unitaire
!= test fonctionnel
!= test de conformité
Ces tests ont été réalisés avant d’effectuer les tests de charge ; au
risque de pertes de temps et de pertinence dans l’analyse des
résultats.
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 7 / 59
12. A quoi cela sert-il ?
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 8 / 59
13. A éviter cela
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 9 / 59
16. La situation
client mécontent
boss encore plus
chef de projet serre les dents
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 10 / 59
17. La situation
client mécontent
boss encore plus
chef de projet serre les dents
soirée de foutue
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 10 / 59
18. Mais pourquoi ?
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 11 / 59
19. Quelle peut être la ou les cause(s) ?
sur consommation de CPU
saturation de mémoire
saturation des io
lock sur la base de données
saturation lien réseau
filesystem plein
...
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 12 / 59
20. Le site préféré des développeurs ?
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 13 / 59
22. Cas d’école
plusieurs dizaines de photos sur la home
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 15 / 59
23. Cas d’école
plusieurs dizaines de photos sur la home
images servies par un cgi
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 15 / 59
24. Cas d’école
plusieurs dizaines de photos sur la home
images servies par un cgi
sources des images non maitrisées
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 15 / 59
25. Cas d’école
plusieurs dizaines de photos sur la home
images servies par un cgi
sources des images non maitrisées
pas de limites sur la taille des images
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 15 / 59
26. Cas d’école
plusieurs dizaines de photos sur la home
images servies par un cgi
sources des images non maitrisées
pas de limites sur la taille des images
resize des images à la volée
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 15 / 59
27. Cas d’école
plusieurs dizaines de photos sur la home
images servies par un cgi
sources des images non maitrisées
pas de limites sur la taille des images
resize des images à la volée
pas de stockage de l’image retaillée
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 15 / 59
30. mais pas en prod !
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 18 / 59
31. So 90’s, now the web is 2.0 !
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 19 / 59
32. Cas d’école, le retour
Situation : problème de performance sur l’affichage de la homepage
en production
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 20 / 59
33. Cas d’école, le retour
situation : problème de performance sur l’affichage de la homepage en
production
lecture de logs
# grep -c "GET / " access.log
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 21 / 59
34. Cas d’école, le retour
situation : problème de performance sur l’affichage de la homepage en
production
lecture de logs
# grep -c "GET / " access.log
# 23 000
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 22 / 59
35. Cas d’école, le retour
situation : problème de performance sur l’affichage de la homepage en
production
lecture de logs
# grep -c "GET / " access.log
# 23 000
# grep -c "GET /api/v1/foo?format=json" access.log
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 23 / 59
36. Cas d’école, le retour
situation : problème de performance sur l’affichage de la homepage en
production
lecture de logs
# grep -c "GET / " access.log
# 23 000
# grep -c "GET /api/v1/foo?format=json" access.log
# 300 000
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 24 / 59
37. Chargeons Tsung de nous aider
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 25 / 59
38. Chargeons Tsung de nous aider
aide-toi, le ciel t’aidera
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 25 / 59
39. Tsung
début développement en 2001
écrit en Erlang
publié sous GNU GPL V2
projet Idealx initialement nommé IDX-Tsunami
test de serveur XMPP
version 1.5.1 stable, 1.6.0 bientôt
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 26 / 59
46. Caractéristiques
multi protocoles
scalable
pas d’interface graphique
scenarios XML avec validation XSL
extensible par plugins
sondes de monitoring
modèle Stochastique avec distribution de Poisson
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 27 / 59
47. Caractéristiques
multi protocoles
scalable
pas d’interface graphique
scenarios XML avec validation XSL
extensible par plugins
sondes de monitoring
modèle Stochastique avec distribution de Poisson
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 28 / 59
48. Protocoles supportés en 1.5.1
HTTP/HTTPS
Websocket
Jabber/XMPP
Webdav
AMQP / MQTT / ZeroMQ
LDAP
MySQL
PostgreSQL
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 29 / 59
49. Principe de fonctionnement
un contrôleur
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
50. Principe de fonctionnement
un contrôleur
0 à N injecteurs
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
51. Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
52. Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
un scenario
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
53. Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
un scenario, des scenarii
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
54. Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
un scenario, des scenarii
des jeux de données de test
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
55. Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
un scenario, des scenarii
des jeux de données de test, pas de dump de production
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
56. Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
un scenario, des scenarii
des jeux de données de test, pas de dump de production
des logs
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
57. Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
un scenario, des scenarii
des jeux de données de test, pas de dump de production
des logs
des rapports de résultats
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 30 / 59
59. Installation
apt-get install tsung
yum install tsung
...
git clone && ./configure && make install
make deb rpm
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 32 / 59
60. Scenario
Example
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="debug" dumptraffic="protocol" version="1.0">
<clients />
<servers />
<options />
<load>
<arrivalphase />
</load>
<sessions>
<session>
<transaction />
<transaction />
</session>
</sessions>
</tsung>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 33 / 59
64. Scenario
Les injecteurs
Simple
<clients>
<client host="localhost" use_controller_vm="true"/>
</clients>
Complexe
<clients>
<client host="foo" weight="1">
<ip value="10.9.195.12"></ip>
<ip value="10.9.195.13"></ip>
</client>
<client host="bar" weight="2" />
</clients>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 35 / 59
65. Scenario
Les injecteurs
Simple
<clients>
<client host="localhost" use_controller_vm="true"/>
</clients>
Complexe
<clients>
<client host="foo" weight="1">
<ip value="10.9.195.12"></ip>
<ip value="10.9.195.13"></ip>
</client>
<client host="bar" weight="2" />
</clients>
Tout le traffic réseau entre le contrôlleur et les injecteurs passe par un
lien ssh monté automatiquement
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 35 / 59
66. Scenario
La charge
Example
<load>
<arrivalphase phase="1" duration="10" unit="minute">
<users arrivalrate="1" unit="second"></users>
</arrivalphase>
<arrivalphase phase="2" duration="60" unit="minute">
<users arrivalrate="10" unit="second"></users>
</arrivalphase>
</load>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 36 / 59
67. Scenario
Création du scenario
En mode proxy
$ tsung-recorder start
Starting Tsung recorder on port 8090
"Record file: /home/rodo/.tsung/tsung_recorder20131003-1633.xml"
Depuis les logs
$ log2tsung.pl
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 37 / 59
68. Scenario
Les requêtes
Example
<request>
<http url="/" method="GET" version="1.1" />
</request>
<request>
<http url="/api/v1/foo?format=json" method="GET" version="1.1" />
</request>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 38 / 59
69. Scenario
Sur le contrôleur
Exécution
$ tsung -f scenario.xml -l logs/ start
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 39 / 59
77. Fonctions avancées
gestion des cookies automatique
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
78. Fonctions avancées
gestion des cookies automatique
thinktime aléatoire
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
79. Fonctions avancées
gestion des cookies automatique
thinktime aléatoire
boucles et sections conditionnelles
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
80. Fonctions avancées
gestion des cookies automatique
thinktime aléatoire
boucles et sections conditionnelles
analyse du résultat
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
81. Fonctions avancées
gestion des cookies automatique
thinktime aléatoire
boucles et sections conditionnelles
analyse du résultat
variables dynamiques
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
82. Fonctions avancées
gestion des cookies automatique
thinktime aléatoire
boucles et sections conditionnelles
analyse du résultat
variables dynamiques
données aléatoires
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
83. Fonctions avancées
gestion des cookies automatique
thinktime aléatoire
boucles et sections conditionnelles
analyse du résultat
variables dynamiques
données aléatoires
extension par modules erlang
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
84. Fonctions avancées
gestion des cookies automatique
thinktime aléatoire
boucles et sections conditionnelles
analyse du résultat
variables dynamiques
données aléatoires
extension par modules erlang
...
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 47 / 59
85. match
L’élément match permet de déclencher une action suivant le contenu
du résultat de la requête.
Example
<request>
<match do="loop" sleep_loop="5" max_loop="10" when="match">Retry</match>
<match do="abort" when="match">Error</match>
<http url="/index.php" method="GET">
</request>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 48 / 59
86. dyn_variable
Les variables dynamiques sont initialisées par lecture du résultat d’une
action et peuvent être ré-utilisées dans les actions suivantes.
Example
<request>
<dyn_variable name="nb_page" re="Page d+ on (d+)" />
<http url="/articles" method="GET" version="1.1" ></http>
</request>
<request subst="true">
<http url="/articles?page=%%_nb_page%%" method="GET" version="1.1" ></http>
</request>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 49 / 59
87. dyn_variable
Lecture d’un fichier JSON
Example
<request>
<dyn_variable name="nb_page" jsonpath="field.array[3].value"/>
<http url="/articles" method="GET" version="1.1" ></http>
</request>
<request subst="true">
<http url="/articles?page=%%_nb_page%%" method="GET" version="1.1" ></http>
</request>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 50 / 59
88. dyn_variable
Utilisation du xpath
Example
<request>
<dyn_variable name="field1_value" xpath="//div[2]/@value"/>
<http url="/articles" method="GET" version="1.1" ></http>
</request>
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 51 / 59
90. Cas concret
jeu télévisé allemand avec retour des téléspectateurs
30 millions de joueurs avec une action toutes les 10 secondes
https://stormforger.com/blog/2014/05/27/load-testing-an-interactive-tv-show-with-over-1-million-users/
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 53 / 59
91. Cas concret
jeu télévisé allemand avec retour des téléspectateurs
30 millions de joueurs avec une action toutes les 10 secondes
fail à 85000 requêtes par secondes
https://stormforger.com/blog/2014/05/27/load-testing-an-interactive-tv-show-with-over-1-million-users/
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 53 / 59
92. Cas concret
jeu télévisé allemand avec retour des téléspectateurs
30 millions de joueurs avec une action toutes les 10 secondes
fail à 85000 requêtes par secondes
test poussé à 330 000/sec ce qui équivaut à 1Millions de joueurs
https://stormforger.com/blog/2014/05/27/load-testing-an-interactive-tv-show-with-over-1-million-users/
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 53 / 59
93. Cas concret
jeu télévisé allemand avec retour des téléspectateurs
30 millions de joueurs avec une action toutes les 10 secondes
fail à 85000 requêtes par secondes
test poussé à 330 000/sec ce qui équivaut à 1Millions de joueurs
plateforme EC2 avec 50 nodes, 800 core, 1.5TB de RAM
https://stormforger.com/blog/2014/05/27/load-testing-an-interactive-tv-show-with-over-1-million-users/
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 53 / 59
94. Cas concret
jeu télévisé allemand avec retour des téléspectateurs
30 millions de joueurs avec une action toutes les 10 secondes
fail à 85000 requêtes par secondes
test poussé à 330 000/sec ce qui équivaut à 1Millions de joueurs
plateforme EC2 avec 50 nodes, 800 core, 1.5TB de RAM
1,213,583,187 requests, soit 50Gbits
https://stormforger.com/blog/2014/05/27/load-testing-an-interactive-tv-show-with-over-1-million-users/
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 53 / 59
95. Cas concret
jeu télévisé allemand avec retour des téléspectateurs
30 millions de joueurs avec une action toutes les 10 secondes
fail à 85000 requêtes par secondes
test poussé à 330 000/sec ce qui équivaut à 1Millions de joueurs
plateforme EC2 avec 50 nodes, 800 core, 1.5TB de RAM
1,213,583,187 requests, soit 50Gbits
taux d’erreur 0.000000216% (1 error every 4,624,616 requests)
https://stormforger.com/blog/2014/05/27/load-testing-an-interactive-tv-show-with-over-1-million-users/
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 53 / 59
96. Quelques conseils
commencez au plus tôt la rédaction des scénarios
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 54 / 59
97. Quelques conseils
commencez au plus tôt la rédaction des scénarios
créez vos données de test avec l’outil de test
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 54 / 59
98. Quelques conseils
commencez au plus tôt la rédaction des scénarios
créez vos données de test avec l’outil de test
architecture de pre-prod au plus près de la prod
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 54 / 59
99. Quelques conseils
commencez au plus tôt la rédaction des scénarios
créez vos données de test avec l’outil de test
architecture de pre-prod au plus près de la prod
le dernier test pour la route en prod
Rodolphe Quiédeville (Novapost) de 1 à 1 million avec Tsung 19 février 2015 54 / 59