Projet : Avenirs-ESR / ePortfolio.
Objet : Méthodologie de tests de charge.
Révision : 1.0.0
Date : 03/02/2025
Auteur : A. Deman
Commentaire : Version initiale
Objectifs
- Mettre en place une méthodologie pour commencer à obtenir des métriques et avoir des repères concernant les temps de réponse cibles pour les différentes API du projet.
Ces premiers tests concernent un module spécifique, avenirs-portfolio-security, chargé de l’intégration OIDC et du contrôle d’accès, de type RBAC.
Cependant, l’objectif est de mettre en place une stratégie transposable pour les autres modules.
- Fournir une base pour quantifier les optimisations ultérieures.
- Pour ce module spécifique, déterminer la bonne stratégie d’intégration : directement au niveau de l’API Manager ou au niveau des contrôleurs des différents modules.
Méthode utilisée
-
Génération de fixtures :
Génération de fixtures de tailles croissantes à l’aide de Faker.
Le script utilise des valeurs de base et un coefficent multiplicateur pour faire varier la taille des jeux de test : 100 utilisateurs/1000 ressources.
Chaque utilisateur a entre 1 et 100 rôles assignés.
-
Chargement des fixtures dans Postgresql et OpenLDAP (cf ERD)
-
Pour chaque jeu de test, exécution de 3 tests de charge en faisant varier le nombre d’accès concurents de 50, 100 et 150 pendant 4 minutes chacun.
Séquence de test :
- Sélectionner aléatoirement un utilisateur.
- Obtenir un access token pour cet utlisateur, via une requête POST sur le end point /oidc/login.
- Effectuer une requête GET sur le end point /roles pour lister les rôles de l’utilisateur.
- Selection aléatoire entre 5 et 20 ressources.
- Selection aléatoire d’une action.
- Pour chaque ressource, l’autorisation de réaliser l’action sur la ressource par l’utlisateur est effectuée via une requête GET sur le end point /access-control/authorize.
Environnement de test
Caractéristiques
- Serveur : avenir-srv-dev, machine virtuelle (QEMU/KVM).
- Processeur 4 coeurs, QEMU Virtual CPU version 2.5+.
- Lien réseau : 1 Gb/s (non partagé pour l’instant, une seule VM sur l’hyperviseur).
- Mémoire : 8 GiB.
- Disque dur : QEMU HARDDISK, Capacité : 130 GB. Intel SSD D3-S4510 Series 2.5” SATA 6.0Gb/s montés en RAID 10.
Limites et remarques
- L’ensemble des services dockerisés sont exécutés sur un seul serveur.
- Les tests sont exécutés depuis un portable.
- Le lien avec le serveur passe par un VPN.
- Les logs des différents services impliqués sont réduits au maximum.
- Pas d’utilisation de cache.
- Pas d’annalyse ni d’optimisation réalisée au niveau du requêtage et de la base de données.
- Les limites max pour la taille des jeux de données et le nombre d’accès concurents ont été déterminées par les limites matérielles de l’environnement de test et pourront être augmentées dans un autre environnement.
Améliorations pour obtenir des valeurs plus significatives
- Déployer les services sur une infra.
- Connexion directe, sans VPN.
- Augmenter le volume des données, par exemple en découpant je jeu de test pour le charger.
- Exécuter le test sur plusieurs clients et avec plus d’accès concurrents en utilisant le mode distribué de locust.
- Eventuellement, s’affranchir du reverse proxy.
- Peut-être retravailler les tests pour supprimer la dimension aléatoire, de façon à pouvoir les rejouer à l’identique.
Resultats
Les limites de l’environnement utilisé rendent les résulats peu significatifs, c’est plus la méthode qui est importante à ce stade.
Cependant, on peut voir que pour les tests avec 50 accès concurents et une base peu chargée, les temps de réponse sont plutôts bons en regard des conditions de test.
L’objectif serait de rester proche de ces temps avec une base plus chargée et plus d’accès concurrents.
Sans surprise, les temps de réponse augmentent avec le nombre d’utilisateurs et le chargement de la base, mais de façon relativement linéaire, ce qui est plutôt rassurant.
Jeu de test : 100 utilisateurs et 4836 assignations de rôles
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
60323 |
0 |
29.27 |
20 |
258 |
148.25 |
251.74 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
4826 |
0 |
28.83 |
21 |
322 |
41 |
20.14 |
0 |
GET |
/avenirs-portfolio-security/roles |
4826 |
0 |
57.79 |
19 |
369 |
65327.46 |
20.14 |
0 |
|
Aggregated |
69975 |
0 |
31.21 |
19 |
369 |
4636.1 |
292.02 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
104193 |
0 |
56.95 |
21 |
317 |
148.25 |
434.45 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
8287 |
0 |
51.96 |
22 |
344 |
41 |
34.55 |
0 |
GET |
/avenirs-portfolio-security/roles |
8282 |
1 |
86.31 |
19 |
323 |
64988.65 |
34.53 |
0 |
|
Aggregated |
120762 |
1 |
58.62 |
19 |
344 |
4587.72 |
503.54 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
107871 |
0 |
147.95 |
12 |
606 |
148.27 |
449.67 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
8677 |
1 |
72.92 |
22 |
491 |
41.03 |
36.17 |
0 |
GET |
/avenirs-portfolio-security/roles |
8671 |
0 |
180.65 |
23 |
569 |
64895.38 |
36.15 |
0 |
|
Aggregated |
125219 |
1 |
145.02 |
12 |
606 |
4624.36 |
521.99 |
0 |
Jeu de test : 500 utilisateurs 23568 assignations de rôles
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
51121 |
0 |
62.69 |
24 |
1566 |
149.22 |
213.19 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
4080 |
0 |
30.75 |
21 |
270 |
41 |
17.01 |
0 |
GET |
/avenirs-portfolio-security/roles |
4079 |
0 |
79.32 |
20 |
1351 |
61528.93 |
17.01 |
0 |
|
Aggregated |
59280 |
0 |
61.64 |
20 |
1566 |
4365.25 |
247.21 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
67923 |
0 |
170.19 |
25 |
525 |
149.22 |
283.17 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
5456 |
0 |
34.46 |
22 |
161 |
41 |
22.75 |
0 |
GET |
/avenirs-portfolio-security/roles |
5450 |
0 |
186.44 |
23 |
466 |
61820.13 |
22.72 |
0 |
|
Aggregated |
78829 |
0 |
161.92 |
22 |
525 |
4405.47 |
328.63 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
67789 |
0 |
330.08 |
25 |
1060 |
149.19 |
282.59 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
5516 |
0 |
36.81 |
22 |
265 |
41 |
22.99 |
0 |
GET |
/avenirs-portfolio-security/roles |
5511 |
0 |
345.95 |
24 |
947 |
62256.09 |
22.97 |
0 |
|
Aggregated |
78816 |
0 |
310.66 |
22 |
1060 |
4484.28 |
328.56 |
0 |
Jeu de test : 1000 utilisateurs 50250 assignations de rôles
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
35050 |
0 |
149.75 |
63 |
539 |
149.29 |
146.18 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
2844 |
0 |
79.21 |
51 |
563 |
41 |
11.86 |
0 |
GET |
/avenirs-portfolio-security/roles |
2842 |
0 |
239.93 |
57 |
794 |
68575.03 |
11.85 |
0 |
|
Aggregated |
40736 |
0 |
151.11 |
51 |
794 |
4915.54 |
169.9 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
38273 |
0 |
407.23 |
65 |
2721 |
149.33 |
159.57 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
3086 |
0 |
91.49 |
52 |
577 |
41 |
12.87 |
0 |
GET |
/avenirs-portfolio-security/roles |
3083 |
0 |
537.76 |
66 |
2410 |
66590.14 |
12.85 |
0 |
|
Aggregated |
44442 |
0 |
394.36 |
52 |
2721 |
4750.89 |
185.29 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
38204 |
0 |
691.03 |
19 |
2734 |
149.26 |
159.28 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
3146 |
1 |
94.7 |
51 |
1214 |
40.99 |
13.12 |
0 |
GET |
/avenirs-portfolio-security/roles |
3137 |
1 |
805.68 |
63 |
2316 |
68069.55 |
13.08 |
0 |
|
Aggregated |
44487 |
2 |
656.94 |
19 |
2734 |
4931 |
185.48 |
0.01 |
Jeu de test : 2000 utilisateurs 98650 assignations de rôles
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
21119 |
0 |
356.66 |
101 |
857 |
149.99 |
88.2 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
1718 |
0 |
77.69 |
52 |
523 |
42 |
7.17 |
0 |
GET |
/avenirs-portfolio-security/roles |
1717 |
0 |
416.74 |
83 |
1768 |
64749.38 |
7.17 |
0 |
|
Aggregated |
24554 |
0 |
341.34 |
52 |
1768 |
4659.71 |
102.55 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
22183 |
0 |
825.97 |
76 |
2334 |
149.92 |
92.52 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
1822 |
0 |
76.71 |
52 |
604 |
42 |
7.6 |
0 |
GET |
/avenirs-portfolio-security/roles |
1815 |
0 |
864.12 |
74 |
1734 |
64428.29 |
7.57 |
0 |
|
Aggregated |
25820 |
0 |
775.78 |
52 |
2334 |
4660.71 |
107.69 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
21981 |
0 |
1323.97 |
67 |
3777 |
149.9 |
91.73 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
1859 |
0 |
82.31 |
50 |
616 |
42 |
7.76 |
0 |
GET |
/avenirs-portfolio-security/roles |
1849 |
1 |
1337.2 |
75 |
2803 |
63392.61 |
7.72 |
0 |
|
Aggregated |
25689 |
1 |
1235.07 |
50 |
3777 |
4694.07 |
107.2 |
0 |
Jeu de test : 3000 utilisateurs 152315 assignations de rôles
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
15214 |
0 |
550.75 |
97 |
2850 |
150.08 |
63.5 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
1246 |
0 |
104.41 |
53 |
751 |
42 |
5.2 |
0 |
GET |
/avenirs-portfolio-security/roles |
1243 |
0 |
682.18 |
196 |
4746 |
66262.5 |
5.19 |
0 |
|
Aggregated |
17703 |
0 |
528.56 |
53 |
4746 |
4784.49 |
73.89 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
15781 |
0 |
1211.55 |
32 |
3672 |
150.07 |
65.82 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
1334 |
0 |
114.75 |
49 |
2053 |
42 |
5.56 |
0 |
GET |
/avenirs-portfolio-security/roles |
1331 |
0 |
1273.82 |
89 |
6155 |
68725.64 |
5.55 |
0 |
|
Aggregated |
18446 |
0 |
1136.72 |
32 |
6155 |
5090.43 |
76.93 |
0 |
Type |
Name |
# Requests |
# Fails |
Average (ms) |
Min (ms) |
Max (ms) |
Average size (bytes) |
RPS |
Failures/s |
GET |
/access-control/authorize |
15863 |
0 |
1892.97 |
45 |
5302 |
150 |
66.15 |
0 |
POST |
/avenirs-portfolio-security/oidc/login |
1373 |
3 |
89.86 |
48 |
652 |
41.91 |
5.73 |
0.01 |
GET |
/avenirs-portfolio-security/roles |
1367 |
1 |
1864.85 |
79 |
3832 |
68449.28 |
5.7 |
0 |
|
Aggregated |
18603 |
4 |
1757.82 |
45 |
5302 |
5160.85 |
77.58 |
0.02 |