Explosée en plein vol. L'antenne de SynopsLive s'est effondrée lundi soir sous l'effet d'une émission semi-prévue, avec des invités drainant littéralement des milliers d'auditeurs. Récit de deux heures d'équilibriste en moonboots.

BrokenPLS.jpg


Du contexte

Il est 20h10. Je rentre tranquillement dans mon petit studio de Ménilmontant, pose mes clés et me souvient que j'ai une lessive à étendre. Je prends mon temps pour étaler mon linge sur l'étendage, en espaçant bien mes chaussettes des slips et les torchons des tee-shirts, en surveillant d'un coup d'œil avec mon téléphone l'heure sur mon smartphone.

Car je suis le fondateur et surtout le responsable technique de SynopsLive, une radio indépendante sur Internet qui diffuse depuis maintenant 7 ans des programmes aussi divers que variés sur le jeu vidéo, la bande dessinée, le cinéma, les médias, la pop-culture… Je vous ferai bien l'article – je le fais souvent dans les festivals (en étant fondateur de la radio) – mais ce soir-là, j'arborais plutôt mon autre casquette, celle de m'assurer qu'en tout instant du jour et de la nuit, l'antenne fonctionne.

Les gens sourient souvent quand je parle d'astreinte pour justifier que je les quitte un instant durant une soirée : oui, certes, personne ne va mourir ou perdre des milliers d'euros si je ne peux pas prendre mon téléphone dans l'instant. Ça m'arrive d'ailleurs de ne pas réussir, mais mon planning de vie est calé sur ceux des émissions, pour me permettre de m'assurer qu'à tout instant, j'aurai du réseau pour aider en cas de problème, à l'aide de l'accès SSH de mon téléphone. Près de 40 passionnés bénévoles aident régulièrement à la création d'émissions pour SynopsLive, via les structures indépendantes et partenaires RadioJV et RadioKawa, tout comme les podcasts indépendants et productions internes.

Ce lundi donc, je jette un œil tranquillement à l'horloge, vérifie que tout va bien ; il est 21h04, le téléphone n'a pas sonné et les auditeurs sont au rendez-vous. Un peu nombreux, d'ailleurs. Le triple des scores habituels.


OnNePeutPas.jpg

Affiche parodique de The Social Network pour introduire une conférence à propos de la technique de SynopsLive, en 2013 aux Joutes du Téméraire.


De l'audience

Vous parler de l'audience des radios sur Internet est toujours compliqué. Les chiffres peuvent paraître si ridicules face aux rouleaux compresseurs des radios FM et des chiffres gonflés à Médiamétrie (qui, malgré son panel très large, cause statistiquement des erreurs de l'ordre de nos propres chiffres d'audience…).

SynopsLive tourne autour de 70 auditeurs durant les émissions, et une dizaine durant le flux permanent de musique libre, que l'on voudrait bien agrémenter de musiques du commerce mais c'est compliqué.

Bien entendu, ce nombre est une moyenne. Certains podcasts – comme ceux de RadioJV, ce n'est pas un secret, ayant fidélisé un public et avec des intervenants prestigieux – dépassent, doublent ou triplent régulièrement ce chiffre en direct. Pas de quoi affoler un sys-admin, nous sommes bien d'accord.

Il nous arrive cependant, de temps en temps, de tenter le diable, en réalisant des opérations spéciales en direct qui ramènent beaucoup d'auditeurs. Le plus récent exploit reste la diffusion en avant-première du dernier épisode de Reflets d'Acide, saga mp3 bien connue (à la Naheulbeuk pour les incultes). Cette émission spéciale, avec son créateur en invité vedette, avait ramené plus de 1500 auditeurs. Pas mal, sachant que cela dépassait le précédant record d'auditeurs en direct de 507 personnes, pour le même genre d’événements, en 2009.

Si l'amplitude est différente, les schémas se répètent souvent. On voit ainsi des chiffres d'audiences anormalement élevés sur des émissions précédant l’événement, les personnes découvrant pour l'occasion une radio qu'ils oublieront dès le lendemain pour la plupart, et une longue traîne des auditeurs suivant une chute vertigineuse dès le début de la fin de l'émission.


De la technique

Il est 21h34. Les chiffres d'audiences augmentent sans arrêt. Preuve de mon inexpérience et de mon manque total de sang-froid, j'ouvre la première fenêtre de discussion Facebook pour engueuler Yann Rieder (InkS), producteur émérite de RadioJV qui n'avait légitiment rien demandé. À vrai dire, à cette heure-là, il anime Le Player Club, l'émission qui précède Passe le Stick, donc je savais qu'il ne pourrais pas me lire.

Capture d'écran de 2014-09-30 00:30:12.png

#LeSangFroid

Évidemment, je suis surtout terriblement en colère contre moi. La veille au soir, j'expliquais sans broncher dans Les Sondiers ô combien j'avais déjà, à une reprise, oublié de faire sauter une soft-limit un jour où le même MV avait eu la bonne idée de passer par les studios virtuels de SynopsLive dans Passe le Stick.

Depuis, les audiences sont stables et nous sommes en plein changement de serveurs, donc après une réduction de voilure et un remerciement chaleureux à nos partenaires, je suis revenu à un mode simple à deux serveurs, l'ancien et le nouveau, pour diffuser SynopsLive et héberger les sites amis (ce qu'on appelle le Trichelieu Network).

Autant dire qu'à la vue de ce tweet un peu plus bas dans ma timeline Twitter, je suis devenu blanc :

Capture d'écran de 2014-09-30 02:14:11.png

Génial ! Oh wait c'est ce so… Et merde.


De la bande passante

Il est 21h38. Il est trop tard pour monter une autre instance Icecast. Trop tard pour rediriger les auditeurs autre part. Je suis piégé à mon propre jeu.

Trichelieu Deux est le deuxième serveur de SynopsLive. Sur celui-ci va être prochainement (depuis huit mois, « prochainement ») transférée toute l'activité de SynopsLive et de ses sites amis. La transition est longue car l'envie de bien faire est bien présente ; Trichelieu Un était mon premier serveur à administrer complètement, et j'avais accumulé les erreurs et le manque de rigueur lié au peu de temps que me laissaient les études ont scellé mes espoirs de réussir à industrialiser les montées de versions des outils internes de SynopsLive au fil du temps. Seul la tête de réseau, Icecast2, est présente sur Trichelieu Deux, pour profiter de la bande passante mirobolante de 200 Mbits1 qu'elle propose.

Si vous faites le calcul rapide, 200 Mbits, cela fait environ 1066 auditeurs potentiels avec une bande passante moyenne de 196 kbits, sans compter tout ce qui peut prendre un peu de bande passante aux alentours (burst de démarrage, ping de stats, etc.).

Capture d'écran de 2014-09-30 02:16:30.png

Me sentant aventureux, je modifie la soft-limit (comprenez, la limite imposée par Icecast après laquelle il refuse toute nouvelle connexion) à 1200 auditeurs. Après tout, SynopsLive diffuse en Opus et Vorbis, qui ont des débits très variables, donc on peut bien en caler un peu plus, hein ?


Du stress

Il est 21h52. Autant vous dire que j'ai mes yeux rivés sur le nombre d'auditeurs. Qui ne cesse d'augmenter. Encore. Toujours.

Capture d'écran de 2014-09-30 00:53:27.png

Capture d'écran de 2014-09-30 00:52:49.png

Je sais à partir de ce moment que si nous dépassons le millier d'auditeurs, tout peut exploser. Une réaction en chaîne peut se passer, car si le serveur ne peut plus accepter de connexion entrante, cela peut causer des problèmes dans d'autres scripts. Oh oui, merde, euh, vite, agissons, corrigeons ça avant que ça arrive…

Capture d'écran de 2014-09-30 00:53:52.png

Ah, tiens, le site de SynopsLive n'est plus accessible. 502 Bad Gateway. C'est terrible que je n'aie jamais pris le temps de personnaliser cette page. Elle est immonde. Elle ne fait vraiment pas pro. J'ai vraiment l'air d'un con. Et pourquoi mon instance Django est tombée ? Trop de monde ? Mais pourtant, pas besoin de rafraîchir la page pour écouter la radio, ce n'est pas ce serveur qui devrait être touché…


Du drame

Il est 22h06. L'émission est commencée, le millier d'auditeurs est dépassé, les serveurs tiennent, c'est la fête, mais il n'est pas possible de s'ajouter au flux actuel, car le site principal est cassé.

La raison principale à cela est une décision technique débile, ridicule qui causerait à n'importe qui l'envie irrépressible de se cogner la tête contre le mur le plus proche.

Durant le développement de la nouvelle version du site de SynopsLive, j'ai eu la drôle d'idée de mettre sur la table l'idée d'une page de direct unique qui évolue au fil du temps. Dès qu'une émission démarre, le fond de la page change d'image, le nom de l'émission est mis à jour. Pour ce faire, un script JS polle comme un bourrin un endpoint dynamique qui va chercher une information dans une base de donnée.

Le code est ici.

Capture d'écran de 2014-09-30 02:00:30.png

La méthode fait une trentaine de ligne, une requête SQL et un appel HTTP… vers le serveur de diffusion, pour obtenir le nombre d'auditeurs actuels. Sans mécanisme de cache. Appelé toutes les 10 secondes par tous les auditeurs.

C'est d'autant plus stupide que je manipule déjà des Websockets en interne et que les mécanismes de cache ne me sont pas inconnus. Juste, sur l'instant, ça ne m'avait pas semblé évident de faire autrement qu'un simple JavaScript qui pingue régulièrement une requête. Quel con.

Les logs explosent, les performances sont détestables, et au bout d'un moment, le worker uwsgi prends trop de temps au goût d'nginx qui se dit qu'il irait bien ailleurs.

Premier hotfix en production. Un petit return {} au début de la méthode, pour que le site revienne. Un petit redémarrage du démon, et c'est reparti. Le site est de nouveau disponible.


Du deuxième drame

Il est 22h15. Alors que je réglais en toute vitesse ce bug débile en production, un autre tout aussi stupide apparaît dans Dradis 1, l'outil vieillissant de gestion du direct.

Dradis, c'est ma fierté. J'en aurai gagné, des cœurs de podcasteurs en montrant avec quelle facilité on peut organiser sa petite émission en quelques clics, passer à l'antenne sans problème. Mais il a un terrible défaut : il est ancien et écrit n'importe comment.

Le cœur de Dradis 1 est en fait un autre projet python, Sydroid2, originellement contrôlé en ligne de commande via une interface à la ncurse. Développé alors que j'étais à l'IUT durant mes heures de temps libre, il est truffé de code smell en tous genre. Je prenais à chaque fois une grande respiration avant de m'attaquer à son amélioration, à tel point que j'en ai abandonné tout espoir de modification, en lançant une refonte qui aura duré trois ans ; je vous vanterai les mérites de Dradis 2 un autre jour.

À l'antenne, c'est la panique. La chronique prévue à 22h20 ne se lance pas. Kocobé et ses invités meublent difficilement, InkS intervient à l'antenne pour présenter ses excuses aux auditeurs et à SynopsLive pour ne pas nous avoir prévenu (il faut que je lui offre des chocolats3 pour le remercier de s'être excusé publiquement si vite) et de mon côté, je trouve rapidement le problème.

Capture d'écran de 2014-09-30 01:57:39.png

Ceci est un extrait d'une méthode de plusieurs centaines de lignes (yay) qui est appelée toutes les secondes. Son exécution est bloquante pour tout le script, qui exécute les ordres des réalisateurs une fois qu'elle est terminée.

Il faut garder en tête qu'initialement, le seul host indiqué était localhost:8000, car tout était originellement hébergé sur le même serveur, sauf en cas de rares occasions où de multiples relais (qu'on peut voir en commentaires) étaient actifs. En remplaçant machinalement localhost par l'adresse du deuxième serveur, je ne m'étais pas rendu compte de la bourde.

Ce soir-là, la requête vers http://live.synopslive.net:8000/status3.xsl n'aboutissait plus. N'étant pas dans le même datacenter, elle était limitée par la bande passante OVH/Internet de Trichelieu Deux, limitée à 200 Mbits. L'appel était particulièrement lent, jusqu'à échouer sur un timeout.

Deuxième hotfix en production. Je remplace cette partie du code par un numauditeurs = 9000 ; ça faussera nos stats, mais une telle valeur devrait lancer un signal important aux réalisateurs qu'il ne faut sans doute plus trop tenir compte du compteur. Les gars, vous pouvez enfin lancer votre chronique.


Du triple drame

Il est 22h32. Pendant que je réglais le site puis l'arrière-guichet Dradis, la limite de bande passante OVH était dépassée. Les auditeurs étaient simplement trop nombreux, et le serveur ne pouvait plus délivrer assez de contenu aux auditeurs. Check-mate.

Capture d'écran de 2014-09-29 23:49:35.png

Le fait que le site soit tombé en premier a fait gagner quelques minutes de répit au serveur de diffusion qui n'a succombé que vers 22h25. Il faut d'ailleurs lire « succombé » comme « saturé au niveau du lien réseau », car la charge du serveur n'a jamais dépassé les 0.70, et la puissance encore bien disponible.

Au bout d'un certain temps, la régulation se fait d'elle même. Le surplus d'auditeurs partent dépités (…je l'espère) de ne pas avoir pu écouter leurs idoles. J'ai échoué ma mission, et mon dos est cassé. Mais l'émission se termine et un nouveau record d'auditeurs en semaine a été battu. Je suis heutriste, ou tristreux, mais surtout fatigué.


De la fin

La réaction en chaîne n'a pas été très simple à vivre humainement. La fuite en avant, avec la certitude de ne pas pouvoir gérer n'est pas une sensation que je souhaite à quelqu'un de vivre. Cela m'a appris, évidemment, que des petites erreurs inoffensives en temps normal peuvent être désastreuses en temps critique ; et que si elle est négligée, la banque du karma vous fait toujours payer très cher votre dette technique.

J'ai la chance d'être entourée de gens bien qui ont de la bande passante disponible au kilo (ou devrait-je dire, au Gigabit). Je vais donc essayer de créer, pour Dradis 2 (sur Trichelieu Deux, si vous avez bien suivi) un véritable réseau de diffusion avec de nombreux relais. Ça ne simplifiera pas mes développements, mais assurera aux auditeurs comme aux bénévoles de SynopsLive une qualité de diffusion permanente, quelque soient les heureux événements que peuvent apporter l'invitation de stars des Internets.

Dans ces moments-là, on a envie de présenter ses excuses à la terre entière, en oubliant aussi ô combien, dans certaines situations, on ne peut pas tout prévoir. Je n'avais pas prévu cela, et même si c'est mon rôle de parer aux imprévus en amont, SynopsLive reste un hobby, chronophage et vie socialophage, mais c'est aussi pour ça que je l'aime.

Cela ne m'a pas empêché de rappeler à toute l'équipe comme il est important de ne pas négliger les aspects techniques de tout ce que l'on entreprend. Sans vos bienveillants (et râleurs) admin-sys, vous êtes à poils sur Internet ; c'est parce qu'il y a quelqu'un dans le placard à tripatouiller des scripts incompréhensibles que vous pouvez faire votre activité géniale visible au plus grand nombre.

Mon cas est atypique (je suis bénévole, j'ai une dette technique énorme et un service qui requiert une disponibilité permanente avec une visibilité non négligeable), mais vous saurez sans doute retrouver dans votre entourage quelqu'un qui correspond à quelques éléments de cette description.

Faites lui un câlin, il ou elle le méritera bien un jour. ♥


Capture d'écran de 2014-09-30 02:24:15.png


Vous pouvez partager cet article en retweetant le tweet original ou en partageant l'adresse de ce post sur vos réseaux sociaux favoris.

1

Merci Octave, même si tu nous avais promis 300 Mbits dans tes newsletters, ainsi qu'un burst qui nous aurait bien servi… Mais les serveurs miniSP, pourtant dans la nouvelle gamme qui n'a duré qu'un mois, n'y ont jamais eu droit. Dommage.

2

Rien à voir avec Android. C'était juste un petit bot, et à l'époque, je n'avais pas fait la relation.

3

Pour le narguer que Môssieur soit Suisse.