Logiciel Panik

From Bubble

Contents

Base

La base installée est une Debian Sarge

Packages installés

En plus de l'installation de base de Sarge, les packages suivants sont installés:
Pour faciliter la maintenance, on vise une installation minimale...

Installation typique d'un noeud

  • Système
    • bzip2
    • (gawk)
    • less
    • iptraf
    • modconf
    • nmap
    • tcpdump
    • traceroute
    • ssh
  • Wifi
    • kismet n'est pas installé car les dépendances sont trop nombreuses ( @) il semble que dans Sarge kismet dépende de X)
    • iperf
    • wavemon
    • wireless-tools
  • NTP
    • ntp
    • ntp-server
    • ntp-simple
    • ntpdate
  • Divers
    • links

Besoins particuliers

Les paquets suivants ne sont installés que si nécessaire:

  • Supervision de processus
    • daemontools
    • svtools
  • Audio
    • aumix
    • cdtool
    • sox
    • vorbis-tools
  • Portables Toshiba
    • toshset (permet d'activer le ventilateur, etc, ....)

Noyeau

Nous utiliserons un noyeau 2.4.27 qui est actuellement la dernière version stable de la série 2.4.

Particularités:

  • Compilé pour une architecture i386 de manière a tourner su n'importe quel hardware
  • Patches Debian
  • Patch Orinoco pour le support du mode moniteur (kismet)
  • Drivers HostAP 0.2.4
  • Utilisation des drivers PCMCIA du noyeau

AODV

On utilise RC:AodvUu dans sa dernière version: 0.8.1 Le démarrage d'AODV se fait via les scripts ifupdown (voir RC:InstallerAodvUu / Binaires pour Debian)

Streaming

Nous avons donc 3 machines en jeu:

  • Studio qui fournit le stream
  • Panik ne sert que de passerelle entre le RC:ReseauCitoyen et Studio
  • Josaphat machine client

La suite logicielle utilisée est Ices 2 / IceCast / OggVorbis

Configuration des Systèmes

Généralités

Le fichier RC:FichierHostsPointsBleus est utilisé
Les requetes DNS sont désactivées dans /etc/nsswitch.conf afin d'éviter des requètes DNS non désirées.

Studio

Configuration

Pour réaliser les tests, j'ai configuré une machine en serveur IceCast:

  • Ices 2 lit l'entrée ligne de la carte son, fait le rééchantillonage, l'encodage OGG et fournit l'entrée à IceCast
  • IceCast 2.0.1 diffuse le stream

On utilise aumix pour sélectionner la source et régler le volume. Points importants:

  • La source à diffuser est celle qui est marquée comme 'R' (Record) dans aumix
  • La seule façon de régler le volume pour Ices est le curseur IGain. Les autre curseur n'influencent que la sortie son 'locale'.
    Le son au départ était trop fort, il a fallu diminuer pour éviter de saturer (curseur IGain sur 50/60%)

L'encodage Ices prend environ 6% du cpu du serveur (AMD 1GHz), l'impact de IceCast est négligeable.
Par contre sur un Pentium 133MHz, Ices utilises 60 à 70% des resources!

La machine utilise Panik comme gateway vers le RC:ReseauCitoyen:

route add -net 10.0.0.0/8 gw 192.<panik>

Maintenance

Pas de maintenance particulière -- s'assurer que la route vers le RC:ReseauCitoyen est toujours définie. Le plus simple est de l'ajouter dans /etc/network/interfaces; par exemple:

auto eth0
iface eth0 inet dhcp
    up route add -net 10.0.0.0/8 gw 192.<panik>

Panik

Configuration

La configuration du noeud est assez simple. Le seul point particulier est la configuration de la passerelle vers Studio.
Comme on ne peux pas faire simplement une passerelle avec RC:AodvUu, Panik fait du DNAT pour donner acces au stream:

iptables -t nat -I PREROUTING -i wlan0 -s 10.<josaphat> -p tcp --dport 8000 -j DNAT --to 192.<studio>:8000

et Masquerade le sous-réseau privé:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wlan0 -j SNAT --to 10.<panik>

La machine est configurée avec une adresse IP fixe du coté filaire (192.168.1.128).
Coté wifi, l'adresse est attribuée sur base de la MAC-Address de la carte (10.154.69.107)

Maintenance

Aucune opération nécessaire au boot.

Toute la configuration réseau est centralisé dans /etc/network/interfaces.

Josaphat

Configuration

On utilise le décodeur ogg123 de OggVorbis pour la lecture du stream (voir ci-dessous pour les détails).
L'adresse du serveur est celle de Panik qui relaie vers Studio

ogg123 -v http://10.<Panik>:8000/ReseauCitoyen.ogg

Le niveau sonore est ici aussi ajusté via aumix. c'est l'entrée PCM qu'il faut ici ajuster.

Le délais entre l'émission et la réception est d'environ 10 secondes.
Même avec un bit rate relativement faible (qualité 0, débit d'environ 35 kbps, en mono) la qualité du son est impecable.

Ogg123 utilise environ 5% du CPU de la machine (Pentium 200 MHz)

La machine est configurée avec une adresse IP fixe du coté filaire (192.168.1.129) -- Non utilisé.
Coté wifi, l'adresse est attribuée sur base de la MAC-Address de la carte (10.8.39.138)

Maintenance

Aucune opération nécessaire au boot.

Toute la configuration réseau est centralisé dans /etc/network/interfaces.

Pour s'assurer que ogg123 tourne en permanence, il est supervisé par les DaemonTools et est rédémaré en cas de problème.
Quelques pointeurs utiles:

  • La ligne de commande exacte pour démarrer ogg123 se trouve dans le fichier /etc/sv/Stream Panik/run.
    Pour des raisons pratiques ce script ne contient que l'appel de /usr/local/sbin/stream-panik. Ce dernier devra être adapté:
    • en fonction de la fréquence de l'échantillonage de la source Ices2 (initialement configuré pour 22050 Hz);
    • si l'adresse de Panik change
  • Le service est redémarré tous les jours à 3:30 du matin, de manière à rafraichir ogg123. Cela est configuré dans le cron, fichier: /etc/cron.d/stream-panik
  • Arrêt / Démarrage / Re-demarage:
    /etc/init.d/stream-panik {start|stop|restart}
  • Activation / Désactivation (lorsque le service est désactivé, il n'est plus démarré au boot, ni redémarré la nuit. Si on ne se sert pas du streaming, il faut le désactiver sinon il va tenter de le démarrer indéfiniment):
    /etc/init.d/stream-panik {enable|disable}
  • Voire les logs:
    mltail Stream Panik

/!\ En cas de problème de streaming: pour le redemarrer il faut:

  • Soit tuer le client dans IceCast, le stream sera redémarré automatiquement
  • Soit executer la commande suivant sur josaphat:
    /etc/init.d/stream-panik restart

Problèmes rencontrés et Solutions

Décalage dans le stream

Après environ 12 heures de streaming, les buffers (Input et Output) de ogg123 se sont retrouvés proches de 0%, avec pour conséquence de légères coupures dans la restransmition.
Si le problème se résoud facilement par un re-démarrage de ogg123, cela pose un problème pour une utilisation 24h/24h.

D'où vient le problème? Ce n'est pas un problème de bande passante, la demande su stream est faible. Pour s'en convaincre, on peux réduire la vitesse du lien (`iwconfig rate 2M`) et démarrer un second ogg123 sans affecter la performance.

Une interprétation est que Josaphat joue légèrement plus vite que Studio ne produit: en effet, Josaphat ne peut lire plus vite que ce qui est disponible et au fil des heures on voit le buffer d'entée diminuer; lorsque le buffer d'entrée atteint 0, la vitesse de conversion ogg diminue puisque le convertisseur doit attendre des données; on voit alors le buffer de sortie qui n'est plus approvisionné au même rythme qu'il est vidé et il commence lui aussi à se vider. Lorsque les 2 buffers sont vides il n'y a plus rien à diffuser et donc on a des microcoupures dans le son...
Une autre interprétation est qu'un décalage est introduit par Studio lors du re-sampling entre l'entrée et la sortie dans Ices2 (48k vers 24K ici). Si la carte son n'est pas exactement sur 48k, on va générer un décalage.
Dans notre cas, la première option est à priviligier -- le décalage étant pratiquement inexistant avec ogg123 tournat sur un autre PC.

Pour être complet, cela n'a pas l'air d'être lié à l'horloge du PC: j'ai synchronisé les 2 machines avec NTP et cela ne change rien.

Comment y remédier? Je présume qu'il est pratiquement impossible d'avoir des systèmes parfaitements synchronisés. On pourrait envisager une amélioration de ogg123 qui dans ce cas de figure recharge ses buffers plutôt que de continuer à travailler à la limite. Sans toucher au software on peut:

  • Augmenter la taille des buffers.
    Cela ne fait que de reporter le problème et augmente légèrement le décalage du stream, mais c'est toujours ça de gagné!
  • Augmenter le pre-buffering de manière a mieux utiliser le buffer d'input.
    Attention toutefois à ne pas avoir le phénomène inverse au cas où, en changeant de hardware, le lecteur serait plus lent...
  • Redémarrer ogg123 toutes les nuits.
    Avec une interruption de retransmission de quelques secondes. Ce n'est pas l'idéal mais je ne vois pas d'alternative dans l'immédiat.

Concernant la taille des buffers, la lecture des sources nous révèle que:

  • La taille par défaut buffer d'entrée est de 64k
  • La taille par défaut buffer de sortie est de 128k
  • Le pre-buffering par défaut est de 50%

Comme nous ne sommes pas trop limités en mémoire sur Josaphat, j'ai effectué un test avec 256k pour l'entrée, 512k pour la sortie avec un pre-buffering de 75% (comme le buffer d'entrée remplit en une fois le buffer de sortie, il se vide de 25% pratiquement en une fois et se stabilise aux alentours de 50-55%).
Ce test de 24 heures confirme les premières observation: avec le hardware utilisé, le lecteur (Josaphat) lit une seconde plus vite par heure que le serveur de stream (Studio), donc de manière régulière: 12 secondes après 12 heures et 24 en 24 heures. Le buffer d'entrée lui a perdu 30-35% de sa capacité, soit 80-90 kB, ce qui est consistant avec le débit: 24 s à 30 kbps = 90 kB.
Donc un buffer d'entrée de 256k rempli à 50% au départ permet sans problème une déviation de +/- une seconde par heure sur 24 heures.
La grande taille du buffer de sortie n'apporte rien ici, si ce n'est un décalage excessif entre le direct et la diffusion (47 secondes au départ avec les paramètres ci-dessus).
Les parametres recommandés pour ce bit rate sont donc:

ogg123 --verbose \
        --buffer 256 --prebuffer 60 --audio-buffer 128 \
        --device oss \
        http://10.51.110.172:8000/ReseauCitoyen.ogg


Pour gérer tout cela, pas la peine de réinventer l'eau chaude, on utilise les DaemonTools de D.J. Bernstein.

Corruption du Stream

Les tests de longue durée ont révélé une corruption du stream -- probablement un bug dans la gestion des buffers de ogg123...

Après un certain temps, un bruit parasite (un toc) est introduit dans le stream. Le bruit se répète à intervalle régulier (à chaque tour dans le buffer).

J'ai effectué plusieurs tests, et ce problème est tout a fait reproductible: le stream est parfait jusqu'à un certain point, et une fois la corruption introduite, elle reste présente at garde le même cycle que la latence du stream (c'est-à-dire de plus en plus fréquent puisque le latence diminue avec la diminution de l'occupation du buffer du au problème précédent.
La corruption se produit après environ 12:30 d'écoute (à affiner)

Ici aussi, une solution possible serait de redémarrer le stream toutes les 12 heures, mais cela implique une interruption en journée.

Cause du problème: Nous avons un streaming à 24 kHz en 16 bits mono (1 canal). Cela nous fait 384 kbps; on atteind donc 2 GB en 12h 25m 39s!
La cause est plus que probablement un dépassement d'entier signé sur 32 bits. Reste à trouver où!

Quelques observation:

  • XMMS n'a pas ce problème -- j'ai joué plus de 39 heures parfaitement.
  • Bien que la grande majorité drivers OSS comptent les bytes joués dans un int (count_info.bytes), cette information n'est disponible que via un ioctl que ogg123 n'utilise pas
  • Un output via aRts au lieu de OSS en direct génère le même problème
  • Un output via raw | sox au lieu de OSS en direct génère le même problème

(!) Nouveau (27-Sep-04): le by-pass du buffer de sortie de ogg123 semble résoudre le problème:

ogg123 --verbose \
    --buffer 256 --prebuffer 60 --audio-buffer 0 \
    --device raw -f - \
    http://10.51.110.172:8000/ReseauCitoyen.ogg | 
    sox -t raw -r 24000 -w -s - -t ossdsp -r 48000 /dev/dsp

C'est un point important, car cela:

  • précise où se situe le problème (ce n'est donc pas un problème de pilote OSS ou de décodage ogg)
  • offre un workaround

Le noeud est maintenant configuré de cette façon.

test avec mplayer

le 07-12-2008 un stream est lancé entre le brusilia et le serveur de domaine public. une carte son est relié a l'émetteur.et ca marche! mais on a rencontré le même prôbleme avec ogg123 , un test avec mplayer est en route avec la commande suivante

 while true ; do mplayer -cache 2048 -cache-min 5 http://streaming.domainepublic.net:8000/radiopanik.ogg -loop 0; done