Journal
5 min de lecture

140 invités simulés : mon test de charge mesurait mon test de charge

J'ai simulé 140 invités pour une fête de 45. La base a tenu sans broncher, un chiffre m'a fait peur pour rien, et le vrai mur était ailleurs : trente connexions par heure sur un Wi-Fi partagé.

Une app de soirée a un défaut particulier : tu ne peux pas la tester en vrai avant le jour J.

Tu peux la faire tourner seul dans ton salon. Avec trois potes au bord d'une piscine. Mais quarante-cinq personnes qui votent en même temps, ça n'existe qu'une fois — et ce jour-là, si ça plante, il n'y a pas de deuxième prise.

Alors fin juin, sept semaines avant mon anniversaire, j'ai écrit un script qui joue les invités. Cent quarante d'un coup. Pour une fête de quarante-cinq.

Pourquoi cent quarante ? Marge de sécurité. Si ça tient à trois fois la charge, je dors tranquille.

La bonne nouvelle : la base s'en fiche

Orfeo repose sur Supabase, en offre gratuite. Chaque invité se connecte anonymement, propose des titres, vote, donne son humeur.

Premier résultat, à 140 invités simultanés :

OpérationNombreMédiane95 % sous
Voter6 74057 ms76 ms
Donner son humeur1 29157 ms79 ms
Proposer un titre420185 ms1 023 ms

Zéro erreur d'écriture. Et le plus parlant : entre 33 et 140 invités, le temps d'un vote passe de 73 à 76 millisecondes. Autant dire rien.

La base de données n'était pas le problème. J'aurais parié le contraire.

Le chiffre qui fait peur

Le problème, c'était le temps réel.

Quand quelqu'un vote, tous les autres téléphones doivent le voir. C'est une diffusion : un événement, envoyé à tous les abonnés. Et là :

AbonnésDélai médian
15278 ms
33299 ms
1402 670 ms

Presque trois secondes. Et pire : à 140, seuls 13 % des événements arrivaient. Le reste se perdait en route.

Trois secondes de retard et neuf messages sur dix perdus, pour une app dont tout l'intérêt est de voir la file bouger en direct. J'ai commencé à regarder les offres payantes.

Le test mesurait le test

Avant de sortir la carte bleue, j'ai relu mon script.

Pour aller vite, j'avais abonné chaque faux invité à la table des propositions. Celle qui change tout le temps : chaque proposition, chaque vote. Cent quarante abonnés sur le flux le plus bavard du système.

Sauf que la vraie app ne fait pas ça. Un vrai invité est abonné à la file de lecture, qui ne change qu'une fois par morceau environ. Pas du tout le même débit.

J'ai refait le test sur le bon canal :

ModèleAbonnésMédianeLivraison
Mon script (tout le monde écoute tout)1402 670 ms~13 %
La vraie app100271 ms100 %

Dix fois plus rapide, et plus aucune perte.

Le chiffre de 2,7 secondes était vrai. Il mesurait juste mon script, pas mon app. J'avais construit un problème, je l'avais mesuré avec soin, et j'avais failli payer pour le résoudre.

Le vrai mur, trouvé par accident

Pendant ce temps, un autre souci me gâchait les tests : impossible de connecter plus de trente faux invités.

J'ai d'abord cru à un bug de mon script. C'était une limite de la plateforme : trente connexions anonymes par heure, par adresse IP. Mon script tournait sur une seule machine, donc une seule adresse. Bloqué à trente.

Gênant pour un test. Mais regarde ce que ça veut dire pour une vraie soirée.

Dans une salle, tout le monde se connecte au même Wi-Fi. Vu de l'extérieur, tous les invités ont la même adresse IP. Donc trente personnes peuvent entrer dans l'heure, et la trente et unième se prend une erreur. Sans message clair, sans rien.

Ça, aucun de mes chiffres de performance ne l'aurait montré. Je l'ai trouvé parce que mon test était mal fichu — une seule machine — et que ce défaut ressemblait exactement à une salle des fêtes.

J'ai relevé la limite avant la soirée. Le jour J, les invités étaient de toute façon en 5G, chacun avec sa propre adresse, et tout est passé sans accroc.

Ce que le test n'a pas vu

Soyons honnête sur les limites.

Mon script simule des invités, pas l'application. Il envoie des votes ; il ne fait pas tourner le code qui s'exécute sur chaque téléphone quand une notification arrive. Et c'est précisément là qu'un vrai défaut se cachait : à chaque mise à jour, chaque téléphone rechargeait tout. Multiplié par le nombre de téléphones.

Ça, je ne l'ai vu qu'en août, pendant la semaine de répétition. Ce sera le sujet du prochain article.

Ce que j'en retiens

Trois choses.

Mesure avant de supposer. J'étais sûr que la base serait le point faible. Elle encaisse 6 740 votes sans une erreur, sur une offre gratuite.

Méfie-toi de ton propre banc d'essai. Un test de charge est un programme, avec ses raccourcis. Quand un chiffre fait peur, la première question n'est pas « combien ça coûte de corriger » mais « qu'est-ce que j'ai mesuré, au juste ».

Et les limites qui te font tomber ne sont pas dans les graphiques de performance. Ce sont des règles administratives : un quota par adresse IP, un plafond de connexions. Elles ne ralentissent rien. Elles disent non.

Orfeo a tourné sur l'offre gratuite. Quarante-cinq invités, quinze heures, pas un euro d'infrastructure.

— Pato