Le problème de la distribution naïve

Supposons que vous ayez un flux en direct entrant et que vous deviez l’envoyer vers 10 destinations : trois points d’ingest CDN, deux serveurs d’enregistrement, un flux de supervision et quatre nœuds de redistribution régionale.

L’approche naïve consiste à décoder l’entrée, faire 10 copies des données d’image et encoder/packetiser chaque copie indépendamment. Cela fonctionne, mais passe mal à l’échelle. Chaque sortie supplémentaire multiplie l’utilisation CPU, la consommation mémoire et la latence. Quand vous atteignez 20 ou 30 sorties, vous achetez du matériel pour copier des octets, pas pour traiter de la vidéo.

Vajra Cast adopte une approche différente : la distribution zéro-copie. Les données d’entrée sont lues une seule fois, stockées dans un tampon partagé, et chaque sortie lit depuis ce même tampon sans le dupliquer. Ajouter une sortie ne coûte presque rien.

Ce que signifie zéro-copie

En programmation système, « zéro-copie » fait référence aux techniques qui déplacent les données de la source vers la destination sans les copier à travers des tampons intermédiaires. L’exemple classique est sendfile() sous Linux, qui déplace les données d’un descripteur de fichier vers un socket réseau sans les copier dans l’espace utilisateur.

La distribution zéro-copie de Vajra Cast applique ce principe au routage de flux en direct :

  1. Les paquets arrivent depuis l’entrée (SRT, RTMP ou tout protocole pris en charge).
  2. Les paquets sont stockés dans un unique tampon circulaire partagé en mémoire.
  3. Chaque sortie maintient son propre pointeur de lecture dans ce tampon circulaire.
  4. Les paquets sont envoyés à chaque sortie directement depuis le tampon partagé — pas de copie par sortie.

Le résultat : l’utilisation mémoire est proportionnelle à la taille du tampon, pas au nombre de sorties. L’utilisation CPU pour la distribution est proportionnelle au nombre d’appels système (un par sortie par paquet), pas au volume de données. Et comme il n’y a pas d’étape d’encodage par sortie (pour les routes en passthrough), le coût de traitement par sortie est négligeable.

Impact sur les performances

La différence entre la distribution par copie et la distribution zéro-copie devient spectaculaire à mesure que vous montez en charge :

SortiesCPU par copieCPU zéro-copieMémoire (copie)Mémoire (zéro-copie)
1RéférenceRéférenceRéférenceRéférence
5~5x~1,02x~5x~1x
10~10x~1,05x~10x~1x
50~50x~1,2x~50x~1x

Ces chiffres concernent le passthrough (sans transcodage). La colonne CPU représente le surcoût de distribution — le coût d’acheminement des paquets de l’entrée vers les sockets de sortie. Avec le zéro-copie, ce surcoût est presque entièrement du surcoût d’appels système (envoi de paquets), pas de la copie de données.

En pratique, cela signifie qu’un seul serveur modeste exécutant Vajra Cast peut distribuer un flux HD vers 50+ sorties sans difficulté. Le goulot d’étranglement passe du CPU à la bande passante réseau, ce qui est la situation idéale.

Indépendance protocolaire

La distribution zéro-copie dans Vajra Cast fonctionne à travers les protocoles. Le tampon partagé contient le flux de transport brut (généralement MPEG-TS), et chaque sortie le packetise selon son protocole :

  • Sorties SRT encapsulent les paquets TS dans des trames SRT avec chiffrement et correction d’erreurs.
  • Sorties RTMP remuxent le TS en conteneurs FLV pour la livraison RTMP.
  • Sorties UDP envoient les paquets TS bruts (pour l’infrastructure legacy).
  • Sorties HLS segmentent le TS en morceaux pour la livraison HTTP.
  • Sorties d’enregistrement écrivent le TS sur disque.

Le travail spécifique au protocole se fait aux extrémités — à l’ingest et à la sortie. La couche de distribution au milieu est agnostique en termes de protocole et opère sur des paquets bruts.

Cela signifie aussi que vous pouvez recevoir un flux via SRT et le distribuer simultanément vers SRT, RTMP, HLS et un enregistrement — le tout depuis le même tampon partagé, le tout en zéro-copie.

Le tampon circulaire

Au cœur de la distribution zéro-copie se trouve le tampon circulaire (aussi appelé buffer circulaire). C’est une région mémoire de taille fixe qui revient au début quand elle atteint la fin.

Comment cela fonctionne

Pointeur d'écriture (entrée)
     |
     v
[  P1  |  P2  |  P3  |  P4  |  P5  |  P6  |  ...  |  Pn  ]
              ^              ^
              |              |
         Sortie A        Sortie B
      pointeur de      pointeur de
         lecture          lecture
  • L’entrée écrit de nouveaux paquets au pointeur d’écriture et l’avance.
  • Chaque sortie lit les paquets à son propre pointeur de lecture et l’avance.
  • Quand un pointeur atteint la fin du tampon, il revient au début.
  • Si une sortie prend trop de retard par rapport au pointeur d’écriture (le tampon fait le tour et écrase ses données), cette sortie est signalée en dépassement.

Dimensionnement du tampon

La taille du tampon circulaire détermine le retard maximum qu’une sortie peut accumuler avant de perdre des données. Vajra Cast dimensionne le tampon en fonction de :

  • Débit du flux — les flux à débit plus élevé nécessitent des tampons plus grands pour la même fenêtre temporelle
  • Tolérance de latence des sorties — les sorties avec une latence plus élevée (par exemple, SRT avec des réglages de latence importants) nécessitent plus d’espace tampon

Un tampon typique contient 2 à 5 secondes de données de flux. Pour un flux à 10 Mbps, cela représente 2,5 à 6,25 Mo — négligeable sur le matériel moderne.

Gestion des dépassements

Si une sortie ne peut pas suivre (congestion réseau, destination lente), son pointeur de lecture prend du retard par rapport au pointeur d’écriture. Quand le pointeur d’écriture dépasse le pointeur de lecture, la sortie a perdu des données.

Vajra Cast gère les dépassements avec élégance :

  1. La sortie est signalée en dépassement dans les métriques.
  2. Le pointeur de lecture est avancé rapidement à la position d’écriture actuelle.
  3. La sortie reprend à partir des données courantes, en sautant le trou.
  4. Un événement est enregistré pour la visibilité opérationnelle.

Cela empêche une sortie lente de bloquer l’entrée ou les autres sorties. Chaque sortie est indépendante — une destination lente n’affecte pas les autres.

Sorties illimitées

Comme la distribution zéro-copie a un coût quasi nul par sortie, Vajra Cast n’impose pas de limite artificielle sur le nombre de sorties par route. Vous pouvez ajouter autant de sorties que votre bande passante réseau le permet.

Cela rend possibles des workflows qui seraient impraticables avec des systèmes basés sur la copie :

  • Fan-out vers des CDN régionaux : un ingest, 20+ points d’ingest CDN régionaux, chacun recevant le même flux.
  • Enregistrement parallèle : enregistrer le même flux dans plusieurs formats ou sur plusieurs backends de stockage simultanément.
  • Prises de supervision : ajouter des sorties de supervision sans affecter le trafic de production.
  • Livraison redondante : envoyer le même flux via plusieurs chemins (principal et secours) vers chaque destination.

Ajouter ou supprimer des sorties est une opération à chaud — elle se produit sans interrompre le flux ni affecter les autres sorties. Connectez une nouvelle sortie via l’API REST ou l’interface web, et elle commence immédiatement à recevoir les données depuis le tampon partagé.

Quand le transcodage est nécessaire

La distribution zéro-copie s’applique aux routes en passthrough où le codec d’entrée et le codec de sortie sont identiques. Quand le transcodage est nécessaire (résolution, débit ou codec différents), le pipeline change :

Entrée -> [Décodage] -> [Encodage Profil A] -> Distribution zéro-copie -> Sorties A1, A2, A3
                      -> [Encodage Profil B] -> Distribution zéro-copie -> Sorties B1, B2, B3

Chaque profil de transcodage unique nécessite sa propre étape d’encodage (qui est gourmande en CPU). Mais une fois encodé, la sortie de chaque profil est distribuée à toutes ses sorties en utilisant le même mécanisme zéro-copie.

Donc si vous avez besoin de variantes 1080p et 720p, vous payez le coût de transcodage deux fois (une fois par profil), mais vous distribuez toujours chaque variante vers autant de sorties que vous le souhaitez à un coût supplémentaire quasi nul.

Considérations pratiques

Bande passante réseau

La distribution zéro-copie supprime le CPU comme goulot d’étranglement, mais la bande passante réseau reste une limite physique. Si vous distribuez un flux à 10 Mbps vers 50 sorties, vous avez besoin de 500 Mbps de bande passante sortante. Planifiez votre réseau en conséquence.

Indépendance des sorties

Chaque sortie dans une distribution zéro-copie est entièrement indépendante. La chute d’une sortie (déconnexion, expiration de délai ou dépassement) n’a aucun effet sur l’entrée ni sur aucune autre sortie. C’est un principe de conception fondamental — l’isolation entre les sorties garantit qu’un problème dans une destination ne se propage jamais.

Supervision

Vajra Cast expose des métriques par sortie pour chaque route : paquets envoyés, octets envoyés, événements de dépassement, retard courant du tampon. Utilisez-les pour détecter les sorties qui prennent du retard avant qu’elles ne débordent.

Prochaines étapes