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 :

    1. Sélectionner aléatoirement un utilisateur.
    2. Obtenir un access token pour cet utlisateur, via une requête POST sur le end point /oidc/login.
    3. Effectuer une requête GET sur le end point /roles pour lister les rôles de l’utilisateur.
    4. Selection aléatoire entre 5 et 20 ressources.
    5. Selection aléatoire d’une action.
    6. 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