Noyau 2.6.X pour l`audio

Transcription

Noyau 2.6.X pour l`audio
Noyau 2.6.X pour l’audio
Willow75
Noyau 2.6.X pour l’audio
par Willow75
Traduit/adapté du site :
http://www.affenbande.org/~tapas/wiki/index.php
(http://www.affenbande.org/~tapas/wiki/index.php?Low%20latency%20for%20audio%20work%20on%20linux%202.6.x)
Table des matières
1. Latence....................................................................................................................................................1
1.1. Latence audio matériel ................................................................................................................1
1.2. Latence de synthé logiciel...........................................................................................................2
1.3. Latence du noyau ........................................................................................................................2
1.4. Latence PCI.................................................................................................................................2
1.5. Scheduling and Schedulers .........................................................................................................3
1.5.1. SCHED_OTHER............................................................................................................3
1.5.2. SCHED_FIFO ................................................................................................................4
1.5.3. SCHED_RR....................................................................................................................4
1.5.4. Choisir la classe de scheduler.........................................................................................4
1.6. Realtime Linux Security module ................................................................................................4
1.7. mlock...........................................................................................................................................5
2. Preemption .............................................................................................................................................6
2.1. Kernel preemption.......................................................................................................................6
2.2. Voluntary preemption (deprecated see Realtime preemption) ....................................................6
2.2.1. Instructions d’Installation...............................................................................................6
2.2.2. Trois points importants ...................................................................................................7
2.3. Realtime preemption .................................................................................................................10
2.3.1. Preemptible Kernel (Low-Latency Desktop)................................................................11
2.3.2. Complete Preemption (Real-Time) ..............................................................................13
3. JACK.....................................................................................................................................................14
3.1. Native POSIX Threads Library.................................................................................................14
3.2. tmpfs ou shmfs ..........................................................................................................................15
3.3. XRUNS (deprecated see realtime preemption).........................................................................16
4. Basse latence pour l’audio...................................................................................................................19
4.1. Obtenir une basse latence avec l’USB ......................................................................................19
5. Info sur le noyau 2.6.x provenant du site www.agnula.org ..............................................................20
5.1. Compiler votre noyau 2.6 realtime............................................................................................20
6. Résumé de mon noyau realtime..........................................................................................................23
iii
Chapitre 1. Latence
http://www.affenbande.org/~tapas/wiki/index.php
(http://www.affenbande.org/~tapas/wiki/index.php?Low%20latency%20for%20audio%20work%20on%20linux%202.6.x)
Il y a différents types de latences rencontrés dans une utilisation typique d’un environnement
informatique pour le traitement audionumérique. Je vais essayer de vous en faire un petit aperçu.
La latence correspond à un retard. Il y a deux façons de connaitre la rapidité d’un ordinateur pour
manipuler des donnés audio, par exemple, on peut utiliser un stream audio :
En sortie : combien de données peuvent être manipulées par seconde, peuvent être mesurées, en bytes
par seconde par exemple.
La latence : combien de temps il faut pour qu’un morceau de données soit disponible aprés que votre
ordinateur l’ai reçu (de même pour les morceaux suivants de données), temps mesuré en secondes.
1.1. Latence audio matériel
On suppose que la taille de la période est la même pour l’enregistrement et la lecture ; et que cette taille
soit égale à 2 périodes. C’est le cas le plus simple
•
Latence d’entrée : Habituellement une carte son aura un buffer d’enregistrement composé de deux
"périodes" se composant chacune de N frames. Une des deux périodes sera occupée par le matériel
alors un IRQ sera défini au temps t_1.
Le driver de la carte son informe l’application, qui attend l’audio, qu’une période est disponible pour
le traitement. La carte son continue de remplir d’autres périodes. La première frames de la période
"incoming" correspond au temp t_2 = t_1-(N/SAMPLERATE).
Ainsi il est possible d’appeler N/SAMPLERATE la "latence d’entrée" de la carte son. Il peut y avoir
éventuellement des latences additionnelles dues à des convertisseurs Digital/Analogique de la carte
son et de dsp. Mais l’application n’a aucune influence sur ces derniers.
•
Latence de sortie: C’est fondamentalement la même chose que pour la latence d’entrée. Une période
est remplie par l’application tandis que l’autre période est jouée par l’application. La carte défini un
IRQ à la fin de la période qui est jouée. Puis l’application remplit la période jouée avant.
Ici nous avons encore la latence N/SAMPLERATE. Et aussi la latence due aux convertisseurs.
1
Chapitre 1. Latence
•
Traitement de la latence : Quelques algorithmes de dsp introduisent la latence dans le flux audio pour
créer une moyenne de quelques frames, ou réaliser une FFT avec des tailles de fenêtre plus grandes
que la taille de période, par exemple.
•
Latence d’aller retour (Roundtrip latency) : C’est, dans le meilleur des cas, la latence d’entrée + la
latence de sortie. Mais aussitot qu’un traitement de latence est utilisé ceci doit être pris en
considération. Nous obtenons : latence d’entrée + latence de traitement + latence de sortie.
Selon l’ordre d’IRQ des périodes entrantes et sortantes une autre période de la valeur des frames doit
être ajoutée à la latence due au buffer.
1.2. Latence de synthé logiciel
On pourrait penser que pour un synthé logiciel, qui produit seulement un flux audio en réponse aux
événements entrants (Midi, oscillateur ou GUI), serait seulement influencé par la latence de sortie du
système. He bien non! :) ce n’est pas toujours vrai.
Un événement se produit au temps t. Au temps t, le synthé logiciel intervient au milieu de la période de
traitement p. La carte son joue la période antérieure p-1. L’événement entrant doit être programmé pour
intervenir à la période p+1.
Ainsi une latence typique de synthé logiciel est au moins équivalente à 2 fois la latence de sortie.
1.3. Latence du noyau
Cette latence correspond au temps d’utilisation du noyau pour informer une application audio de l’IRQ
de la carte son. Ce temps doit être très court et constant.
Imaginez une taille de période de 64 frames. À un taux d’échantillonages de 48000 hertz, cela signifie
qu’une interruption apparait toute les 64/48000 de sec soit 1.3ms. Par exemple si le noyau a besoin de 1
ms, il ne reste que 0.3 ms pour manipuler les données audio.
La manipulation des IRQ est très rapide, Le vrai problème est quand une autre partie du noyau est
éxécutée et qu’elle est non "préemptible" (déchargeable) pendant un long moment.
Les patchs Kernel Preemption, Voluntary Preemption et notamment realtime preemption essayent de
fractionner les longs "codepaths", ainsi la latence moyenne du noyau devient très petite.
2
Chapitre 1. Latence
1.4. Latence PCI
Le terme latence PCI correspond au temps pendant lequel le matériel garde le bus pour lui. Ainsi, plus la
latence PCI d’un dispositif est longue, plus grande sera la "largeur de bande de bus" obtenue et plus cela
interférera avec d’autres synchronisations de matériels.
Utilisez la commande "lspci - v" pour inspecter les latences PCI de vos dispositifs.
Maintenant si vous voulez que votre carte son soit le dispositif préféré de PCI, définissez alors sa latence
à 128. Ramenez les latences PCI de tous autres dispositifs PCI à quelque chose comme 64 ou 32.
Ma carte son a l’adresse de bus suivante :
0000:00:0d.0 Multimedia audio controller: Cirrus Logic CS 4614/22/24 [CrystalClear SoundFusion
Audio Accelerator] (rev 01)
Pour définir la latence pci de ce matériel au maximum (248=FEh) j’utilise : setpci -s 0:0d.0
latency_timer=fe .
Si vous voulez plus d’info (en anglais), ou man lspci et man setpci
http://www.reric.net/linux/pci_latency.html
1.5. Scheduling and Schedulers
Linux 2.6.x a trois différentes classes d’établissement de programme (scheduling) :
1.5.1. SCHED_OTHER
Cette classe est utilisée pour des processus normaux w/o RT. La plupart des processus sur un poste
bureautique typique sont dans cette classe. Il y a une variété de schedulers disponibles pour cette classe.
•
original two-arrayed O(1) scheduler
•
Con Kolivas staircase scheduler
•
some single priority array schedulers
•
etc (il ya plusieurs schedulers pour le sous système d’entrée sortie
3
Chapitre 1. Latence
Ce qui est commun pour tous ces schedulers est qu’ils n’ont aucun impact sur les processus de la classe
SCHED_FIFO ou de la classe SCHED_RR. Aussi longtemps que vos tâches audio seront éxécutées par
la classe SCHED_FIFO, le choix du scheduler SCHED_OTHER n’aura aucun effet.
1.5.2. SCHED_FIFO
Cette classe est basée sur la priorité. Tous les processus utilisant SCHED_FIFO sont exécutés avant
n’importe quel processus SCHED_OTHER.
Si un thread SCHED_FIFO a une priorité statique plus élevée qu’un autre alors il obtient le cpu en
premier. SCHED_FIFO fonctionne sans timeslices. Ceci signifie qu’un processus de SCHED_FIFO
commencé, s’éxécutera jusqu’à ce qu’il renonce au cpu volontairement ou à cause d’un processus ayant
une priorité plus élevée.
1.5.3. SCHED_RR
Dans SCHED_RR, n’importe quel thread prioritaire élevé qui devient exécutable devient un thread de
faible priorité. Essentiellement le scheduler définit des files d’attente, une pour chaque niveau de priorité.
1.5.4. Choisir la classe de scheduler
Pour inspecter et défnir la classe de scheduler de certains processus il faut utiliser l’utilitaire chrt du
paquet schedutils.
Quelques applications peuvent, cependant, définir la classe scheduling pour leurs propres threads,
notamment jackd. Ils doivent être éxécutés en root ou doivent utiliser des capacités particulières,
realtime-lsm par exemple.
1.6. Realtime Linux Security module
Si vous voulez donner des droits temps réels aux processus non root vous devez d’abord télécharger ceci.
realtime-lsm (http://sourceforge.net/projects/realtime-lsm)
Ou si vous utilisez une debian tapez
4
Chapitre 1. Latence
apt-get install realtime-lsm realtime-lsm-source module-assistant
cd /usr/src/
tar jxvf realtime-lsm.tar.bz2
module-assistant build realtime-lsm
dpkg -i realtime-lsm-module-2.6*.deb
Ceci peut être utilisé pour donner certaines possibilités aux simples utilisateurs , groupes, ou même à
tous les utilisateurs.
On charge comme ceci : modprobe realtime gid=1002 . Pour tous les utilisateurs appartenant au groupe
1002 :
•
les processus lancés appartiennent à la classe SCHED_FIFO
•
les processus de mémoire "sont mlock et mlockall" pour empêcher les permutations
Si vous utilisez un système debian, votre utilisateur appartient probablement à un groupe appelé audio
avec le gid 29 donc tapez modprobe realtime gid=29.
Information pour les ex-utilisateurs de 2.4.x : N’utilisez pas jackstart. Il n’est pas nécessaire quand
realtime-lsm est installé. Lancé directement Jackd par l’intermédiaire de jackd - R ou de JACKControl...
1.7. mlock
"mlocker" un secteur de mémoire virtuelle signifie "bloquer" cette mémoire virtuelle dans la RAM
physique, de ce fait on s’assure qu’elle ne sera jamais permutée.
Un processus qui doit être éxécuté comme un processus Temps réel doit utiliser mlock pour s’assurer que
rien n’est permuté, ce qui aurait comme conséquence des latences énormes.
Seulement les processus avec les priviléges root peuvent utiliser mlock/mlockall. sauf si vous utilisez
relatime-lsm
5
Chapitre 2. Preemption
2.1. Kernel preemption
C’est une technique où certains codepaths dans le noyau peuvent être interrompus pour être précédés par
des paths prioritaires plus élevés.
Cette technique est trés différente de voluntary preemption. Dans le cas du kernel préemption, le
scheduler décide quel thread du noyau est éxécuté. Dans le cas de voluntary preemption, le thread du
noyau signale lui même qu’il veut utiliser le cpu.
Donc je conseille voluntary preemption ou encore mieux realtime preemption.
2.2. Voluntary preemption (deprecated see Realtime
preemption)
voici le lien pour télécharger le patch d’ingo
http://people.redhat.com/mingo/realtime-preempt/
La version la plus ancienne est le patch Real-Time Preemption - V0.2. Lisez l’annonce suivante (en
anglais).
http://lkml.org/lkml/2004/10/22/207
Les patchs d’Ingo sont basés sur l’ensemble de patch d’Andrew Morton, voici le lien.
http://kernel.org/pub/linux/kernel/people/akpm/patches/2.6/
Attention, les patchs VP sont encore en developpement et changent régulièrement, je mettrai à jour ces
pages quand ils seront plus stable donc pensez a vérifier sur le site lkml.org les annonces de ces patchs.
2.2.1. Instructions d’Installation
Téléchargez les sources du noyau et des patchs désirées et décompressez les dans le repertoire usr/src/,
ici exemple avec un 2.6.9
6
Chapitre 2. Preemption
tar xjf linux-2.6.9.tar.bz2
Allez dans le repertoire linux-2.6.9 et appliquez le patch 2.6.9-rc2
patch -p1 < /chemin/du/patch/patch-2.6.9-rc2
Faites la même chose pour le patch mm4
patch -p1 < /chemin/du/patch/2.6.9-rc2-mm4
Si vous n’avez pas de message d’erreur tapez
patch -p1 < /chemin/du/patch/realtime-preempt-2.6.9-rc2-mm4-S7
Activez voluntary preemption, kernel preemption, hardirq, softirq preemption, big kernel lock
preemption, et si vous en avez besoin preempt-timing et preempt-tracing stuff dans la config du noyau et
configurez le reste du noyau comme vous avez l’habitude de le faire.
Compilez et installez le.
2.2.2. Trois points importants
2.2.2.1. La partie Voluntary preemption
C’est une technique où les codepaths dans le noyau "donnent" le cpu volontairement à certaines taches,
on peut la comparer au traitement multitâche cooperatif.
Cela permet d’améliorer la latence, de longs codepaths peuvent être décomposés en plus petits, de ce fait
réduisant la latence du noyau. Il semble que cette technique est une bonne addition de kernel preemption
disponible dans les noyaux vanilla.
7
Chapitre 2. Preemption
Il y a un fichier dans /proc pour controler la préemption d’un noyau patché avec les patch VP d’Ingos.
Définissez /proc/sys/kernel/kernel_preemption et proc/sys/kernel/voluntary_preemption à 1. Utilisez ces
commandes :
echo 1 > /proc/sys/kernel/voluntary_preemption
echo 1 > /proc/sys/kernel/kernel_preemption
Avec des versions antérieures des patchs VP, /proc/sys/kernel/voluntary_preemption peut être défini à
des valeurs > 1. Si vous éxécutez un ancien patch, utilisez les valeurs :
0:
1:
2:
3:
off
more preemption + max_sectors_kb
more preemption + max_sectors_kb + redirect softirqs
more preemption + max_sectors_kb + redirect softirqs + redirect hardirqs
2.2.2.2. La partie threaded IRQ handlers
Pour activer threaded IRQ handlers, utilisez les commandes suivantes
echo 1 > /proc/sys/kernel/hardirq_preemption
echo 1 > /proc/sys/kernel/softirq_preemption
Quand threaded irq handlers est utlisé , chaque irq handler a une entrée dans /proc/irq
La commande suivante permet de montrer quels irqs handlers sont éxécutés threaded(1) ou
non-threaded(0). Exemple:
grep .
/proc/irq/*/*/threaded
Le résultat sur mon ordinateur donne ceci
8
Chapitre 2. Preemption
/proc/irq/10/eth0/threaded:1
/proc/irq/12/i8042/threaded:1
/proc/irq/14/ide0/threaded:1
/proc/irq/15/ide1/threaded:1
/proc/irq/1/i8042/threaded:1
/proc/irq/5/CS46XX/threaded:0
/proc/irq/8/rtc/threaded:0
Pour placer la valeur à 0 pour l’iRQ 5 et 8 j’ai utilisé les commandes suivantes :
/bin/echo 0 > /proc/irq/8/rtc/threaded
/bin/echo 0 > /proc/irq/5/CS46XX/threaded
Et si vous entrez ces lignes dans le fichier /etc/rc.local ou dans un autre script de démarrage,
assurez-vous que le module de la carte son soit réellement chargé avant.
En utilisant le programme chrt du paquet schedutils vous pouvez changer la priorité et la politique de
scheduling de certains IRQ handlers. Une configuration possible est de définir tous les threads, excepté la
carte son et rtc, SCHED_FIFO à une priorité de 10.
jackd est éxécuté avec une priorité temps réel de 20. De cette façon aucun irq handler ne peut acquérir la
carte son /jackd/rtc.
2.2.2.3. Contrôle des tailles de données maximum pour les bloc
d’interfaces
Dans /sys/block/hd*/queue/ il y a un fichier appelé max_sectors_kb qui peut être utilisé pour faire que le
code qui manipule les entrées-sorties du dispositif emploie de plus petits morceaux de données, cela
réduit le temps pris pour accomplir le transfert et réduit de ce fait la latence du noyau.
Cela semble bien fonctionner quand on défini cette commande à 16 pour les hd. Si vous avez des xruns
reliés à l’activité de vos disques, vous pourriez essayer ceci.
echo 16 > /sys/block/hda/queue/max_sectors_kb
9
Chapitre 2. Preemption
Pour vérifier ce qui est défini pour chacun de vos dispositifs de bloc, tapez la commande suivante :
grep . /sys/block/*/queue/max_sectors_kb
Si vous n’avez pas de dossier /sys, soyez sûr d’avoir un noyau compilé avec l’option
CONFIG_SYSFS=y. Ajoutez alors à /etc/fstab la ligne suivante :
sysfs
/sys
sysfs
defaults
0
0
Synchronisation de latence : Le patch voluntary preempt introduit également des mécanismes puissants
pour vérifier plus finement les latences existantes du noyau. Voir la page sur XRUN pour plus de détails.
2.3. Realtime preemption
Le patch realtime preemption est disponible ici
http://people.redhat.com/mingo/realtime-preempt/
Maintenant il vous faut patcher le kernel. Si vous ne vous sentez pas à l’aise avec cette opération, il y a
un script disponible ici
http://affenbande.org/~tapas/RP-patch-script
Ce script essaye de télécharger toutes les sources nessecaires et les patchs pour patcher le noyau avec le
patch realtime préemption + le patch realtime lsm (le script n’est pas toujours a jour, mais vous pouvez
facilement le modifier pour une version plus récente des patchs)
Choisir le modèle de préemption. Le patch Realtime préemption introduit de nouveaux modèles de
préemption qui tiennent compte des opérations basse latence.
Allez voir la section
Processor type and features
10
Chapitre 2. Preemption
du menu make menuconfig des sources du noyau, une nouvelle option est aparue
Preemption Mode
Elle offre 4 choix
No Forced Preemption (Server)
Voluntary Kernel Preemption (Desktop)
Preemptible Kernel (Low-Latency Desktop)
Complete Preemption (Real-Time)
Les options les plus intéressantes pour le travail audio basse latence avec linux sont "Preemptible Kernel
(Low-Latency Desktop)" et "Complete Preemption (Real-Time)"
2.3.1. Preemptible Kernel (Low-Latency Desktop)
C’est un arrangement approprié pour les personnes qui n’ont pas un besoin de latences vraiment basses.
En choisissant ce modèle de préemption, veillez à permettre également :
Thread Softirqs
and
Thread Hardirqs
Ce paramètre permet essentiellement que l’éxecution des irg soit soumise aux decisions du scheduler
(planificateur). Les Irq ne sont pas necessairement exécutés directement, mais plutôt reportés dans un
"handler thread". Cette "handler thread" fonctionne avec des privilèges realtime (voir la section
Scheduling and Schedulers).
11
Chapitre 2. Preemption
Les priorités de ces irq handler threads sont fixées autour de 50. Ainsi en assignant une priorité en temps
réel plus élevée à jackd nous sommes certains que les irq ne perturbent pas JACK.
Assurez vous aussi que
Old-Style Big Kernel Lock (NEW)
soit désactivé. Configurez le reste du noyau comme vous le souhaitez, compilez et rebootez. Maintenant
il faut unthreaded l’irq "handler thread" de votre carte son. Sur mon système j’utilise la commande
suivante:
/bin/echo 0 > /proc/irq/3/CS46XX/threaded
Cela fait que l’irq de la carte son est la seule interruption qui soit traitée immediatement. Tout les autres
IRQ sont reportés dans leurs handler threads respectifs. Pour découvrir quel irq utilise votre carte-son,
utilsez la commande :
cat /proc/interrupts
Voici le résutat sur mon système
~$ cat /proc/interrupts
CPU0
0: 357694670
1:
192527
2:
0
3:
3683355
5: 203367747
8:
12983156
10:
18757427
11:
652848
12:
3109504
14:
1693997
15:
3617940
NMI:
0
ERR:
600
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
timer 0/94670
i8042 0/92527
cascade 0/0
CS46XX 0/83355 <--- my soundcard
ICE1712 0/67747 <--- another one :)
rtc 0/83156
eth0 0/57427
nvidia 0/52848
i8042 0/9504
ide0 0/93997
ide1 0/17940
12
Chapitre 2. Preemption
Il est important d’avoir un simple irq pour la carte son, parce qu’autrement d’autres dispositifs de cet irq
obtienent le même traitement prioritaire qui pourrait déranger l’exploitation de la carte-son.
Assurez-vous aussi d’exécuter jackd en temps réel avec une priorité d’au moins 60 (parce que les autres
irq handlres thread ont un priorité autour de 50 et nous voulons que JACK soit plus haut).
2.3.2. Complete Preemption (Real-Time)
En choisissant l’option complete preemption, vous ne devez pas spécifiquement permettre le threaded irq
handlers comme dans le preemption model.
La différence principale est qu’à cause de cela nous ne pouvons pas "unthreader" l’ird handler de notre
carte-son. Cela signifie que nous devons donner une très haute priorité à son irq handler thread.
Vous pouvez utiliser l’utilitaire chrt de la suite schedutils pour ceci
http://www.tech9.net/rml/schedutils/
Pour mettre la priorité de l’irq handler de la carte son à 99 (le plus haut possible), utilisez une commande
semblable à la suivante :
chrt -f -p 99 ‘pidof "IRQ 3"
13
Chapitre 3. JACK
3.1. Native POSIX Threads Library
Lisez la Faq du site de JACK pour des renseignements sur jackd et Native POSIX Threads Library libc.
Assurez-vous de la lire si vous utilisez un noyau 2.6.x ou 2.4.x avec le support NPTL patché.
Si vous obtenez des résultats absolument non satisfaisants avec un noyau 2.6.x, il y a de grandes chances
que vous ayez un problème avec Native POSIX Threads Library et que jackd se comporte bizarrement.
Il faut exporter la variable d’environnement LD_ASSUME_KERNEL et la définir à 2.4.22. Cela
empêchera libc d’utiliser NPTL.
Exécutez jackd comme cela :
LD_ASSUME_KERNEL=2.4.22 jackd -R -d alsa ....
Exécutez tous les clients comme :
LD_ASSUME_KERNEL=2.4.22 qjackctl
ou
LD_ASSUME_KERNEL=2.4.22 ardour
Pour vérifier que vous utilisez libc avec NPTL activé, utilisez la commande suivante (en fait vous
exécutez libc)
pnambic@sokoban:~> /lib/libc.so.6
GNU C Library 20040808 release version 2.3.4, by Roland McGrath et al.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
14
Chapitre 3. JACK
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6).
Compiled on a Linux 2.6.7 system on 2004-08-12.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
Le mot-clé à chercher est "Native POSIX Threads Library", bien sûr. Et si cela n’apparait pas, utilisez la
commande suivante :
willow@debian:~$ getconf GNU_LIBPTHREAD_VERSION
NPTL 0.60
3.2. tmpfs ou shmfs
Jackd doit utiliser fifo pour communiquer avec les clients JACK. Ces fifos ne doivent pas être sur un hd
réel, mais plutôt dans un système de fichiers virtuel comme tmpfs. Avoir fifo sur un hd réel, peut
provoquer beaucoup de Xruns.
Jackd peut être configuré au moment de la compilation pour utiliser un certain répertoire pour ses fifos.
Le répertoire par défaut est /tmp.
Beaucoup de distributions installent le paquet jackd de façon à ce qu’elle utilise /dev/shm (contrôlez avec
mount, si c’est tmpfs ou shmfs de monter).
Si vous trouvez vos fichiers fifo de JACK dans /tmp et si /tmp est sur un hd ordinaire vous pouvez obtenir
des Xruns préoccupants. Ainsi montez tmpfs ou shmfs sur /tmp (sa taille est cependant limitée à votre
mémoire virtuelle). Vous pouvez aussi recompiler jackd à partir des sources et définir le montage tmpfs
ou shmfs de votre choix.
Les fichiers fifo ressemblent a ceci :
15
Chapitre 3. JACK
tapas@mango:~$ ls /dev/shm/ -l
total 0
prw-r--r-- 1 tapas tapas 0 Sep
prw-r--r-- 1 tapas tapas 0 Sep
prw-r--r-- 1 tapas tapas 0 Sep
srwxr-xr-x 1 tapas tapas 0 Sep
srwxr-xr-x 1 tapas tapas 0 Sep
24
24
24
24
24
02:08
02:08
01:55
01:55
01:55
jack-1000-ack-fifo-31582-0
jack-1000-ack-fifo-31582-1
jack-1000-ack-fifo-31582-2
jack_1000_0
jack_1000_ack_0
Pour vérifier que tmpfs ou shmfs est présent, utilisez ceci
tapas@mango:~$ mount|grep /dev/shm
tmpfs on /dev/shm type tmpfs (rw)
3.3. XRUNS (deprecated see realtime preemption)
ALSA a une option au moment de la compilation du noyau pour debuger les Xruns. Activez ALSA
debugging dans la config de votre noyau et recompilez les modules alsa.
Activez le Xrun debugging en utilisant les commandes suivantes :
echo 2 > /proc/asound/card0/pcm0p/xrun_debug
echo 2 > /proc/asound/card0/pcm0c/xrun_debug
Ceci suppose que votre carte son est la carte 0. Vous devriez maintenant voir les Xruns dans le fichier
/var/log/syslog. Il peut être pratique de rediriger ce fichier dans une console:
tail -f /var/log/syslog
Il y a aussi un patch preempt timing pour le patch O4 (voluntary preemption) disponible ici :
http://redhat.com/~mingo/voluntary-preempt/preempt-timing-on-2.6.8-rc3-O4.patch
16
Chapitre 3. JACK
Ce patch ajoute un fichier :
/proc/sys/kernel/preempt_thresh
Qui peut être utilisé pour créer un rapport sur n’importe quels chemins du noyau prennant un plus long
seuil en microsecondes. Quelque chose comme cela devrait donner de bons résultats :
echo 1000 > /proc/sys/kernel/preempt_thresh
Les rapports sont mis dans le fichier /var/log/syslog. Définissez à 0 pour désactiver ce service :
echo 0 > /proc/sys/kernel/preempt_thresh
Notes : Le code preempt timing est incorporé dans les VP patch versions O7 et suivant.
La version O7 des VP patchs introduit 2 nouveaux mécanismes de temps de latence :
1) Si preempt_thresh est définit à 0, le code preempt timing générera un rapport quand un nouveau
maximum de latence sera atteint. Ainsi il existe un nouveau fichier,
/proc/sys/kernel/preempt_max_latency
d’où la valeur de latence maximale actuelle atteinte peut être lue. Ce fichier est aussi modifiable pour
réinitialiser le code preempt timing.
2) Il y a aussi un nouveau fichier
/proc/sys/kernel/trace_enabled
17
Chapitre 3. JACK
qui activera le nouveau preempt trace code dans VP > O6 (on doit l’avoir activé dans la config du noyau.
Cette trace est plus détaillée que l’ancien rapport et celui ci peut toujours être lu à partir de :
/proc/latency_trace
AVERTISSEMENT
En activant xrun_debug et preempt timing vous allez probablement déclencher de faux preempt timing
rapport par les applications qui ont provoqué des xruns (chaque déclenchement d’un rapport xrun_debug
déclenche à son tour un rapport preempt timing).
Il y a aussi le danger que les rapports preempt timing déclenchent des Xruns (en utilisant des petits seuils
preempt). Donc soyez prudent.
18
Chapitre 4. Basse latence pour l’audio
La série des noyaux 2.6.x serait moins performante que la série 2.4.x avec les patchs lowlatency et/ou
preemptible appliqués. Pour certains, les performances sont satisfaisantes mais pour d’autres cela est
insuffisant. Particulièrement quand on travaille avec de très petites tailles de périodes comme 128 ou 64
frames pour les opérations en temps réel.
Ceci est vrai pour les noyaux 2.6.x vanilla (même avec le kernel préemption) mais cela n’est plus valable
pour les noyaux 2.6.x patchés avec les patchs "voluntary preemption" d’Ingo Molnars. Ces patchs sont
toujours en developpement mais permettent déja d’éxécuter jackd avec 2*128 frames et xrun libre, le
temps de latence pour 256 frames à un taux d’échantillonage de 48000hz est autour de 5.3ms.
Comme la série S des patchs VP, ils sont basés sur le mm kernel. Ceci signifie que vous exécutez
techniquement un kernel expérimental, mais cela fonctionne correctement dans la plupart des
configurations.
Il n’existe aucun noyau prépackagé avec les patchs VP, ainsi vous devez les contruire vous mêmes.
Veuillez être sur de ce que vous faites, en cas de doute au sujet des infos fournit sur ces pages, vérifiez
svp les annonces d’ingo sur lkml.org.
Si vous obtenez des résultats non satisfaisants avec un noyau 2.6.x, il y a une grande probabilité que ce
soit du a un probléme avec NPTL. lisez la page de Jackd & NPTL. Un autre problème connu est les
tmpfs .
Attention Les noyaux VP basés sur un 2.6.9-rc3-mm2 sont cassés (USB suibsystem principalement et
ACPI)
4.1. Obtenir une basse latence avec l’USB
Voir ce lien
http://www.affenbande.org/~tapas/wiki/index.php?USB%20Low%20Latency%20Success
19
Chapitre 5. Info sur le noyau 2.6.x provenant du
site www.agnula.org
Ces infos datent d’octobre 2004, depuis agnula a packagé un noyau 2.6.10-multimedia (voir sur les
serveurs de paquets d’agnula)
Comme n’importe quelle distribution Debian récente, DeMuDi peut aussi utiliser un noyau 2.6. Le
paquet debian noyau 2.6 peut facilement être installé. Cependant, pour des users normaux (non hackers)
on recommande les noyaux 2.4 pour la production audio. Les performances en temps réel du noyau 2.4
DeMuDi sont assez bonnes et le noyau est stable.
Pour améliorer la latence et tenir compte de l’exploitation en temps réel, le noyau 2.6 doit être patché. Le
dernier noyau est le 2.6.9 et la performance audio n’est pas aussi bonne que pour le noyau 2.4 DeMuDi.
Mais le développement va à une allure rapide et des patches sont disponibles.
Pour l’instant, la combinaison des patchs mm et des patchs realtime est le meilleur choix. Ces patchs
changent chaque jour, surtout l’amélioration, mais aussi avec des bugs de temps en temps, donc moins de
stabilité. Vous êtes avertis.
5.1. Compiler votre noyau 2.6 realtime
Nous allons donc patcher les sources du kernel avec le patch mm et le patch realtime. Notez que cela
n’incluera pas les patchs debian, ainsi il pourrait y avoir quelques problèmes de compatibilité avec votre
installation debian. Cependant, pour la plupart des personnes cela fontionne trés bien.
1. Pour compiler des noyaux nous utiliserons la méthode debian, c’est plus simple d’utiliser des paquets
.deb, installez ces outils :
apt-get install fakeroot kernel-package
Obtenez, avec wget, le noyau de votre mirroir kernel.org favori
http://mirror.switch.ch/ftp/mirror/kernel/linux/kernel/v2.6/
(http://mirror.switch.ch/ftp/mirror/kernel/linux/kernel/v2.6/)
tapez
20
Chapitre 5. Info sur le noyau 2.6.x provenant du site www.agnula.org
cd /usr/src
tar jxvf linux-2.6.9.tar.bz2
ln -s linux-2.6.9 linux
Obtenez le patch mm
http://kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9/2.6.9-mm1/
(http://kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9/2.6.9-mm1/)
Tapez
cd linux
bzip2 -dc ../2.6.9-mm1.bz2 | patch -p1
cd ..
Obtenez le patch reatime preempt d’Ingo Molnars
http://people.redhat.com/mingo/realtime-preempt/ (http://people.redhat.com/mingo/realtime-preempt/)
Tapez
patch -p0 < realtime-preempt-2.6.9-mm1-V*
Configurez le noyau. Pour faire un vrai paquet debian, il faut éditer EXTRAVERSION dans le fichier
Makefile pour ne pas avoir de majuscule. Tapez
vi +/EXTRAVERSION Makefile
Maintenant compilez votre noyau, cela peut être long. tapez
time fakeroot make-kpkg --initrd kernel_image
21
Chapitre 5. Info sur le noyau 2.6.x provenant du site www.agnula.org
Vous pouvez avoir des messages concernant cramfs et initrd, mais cela n’est pas problèmatique. Par
contre l’auteur a eu un problème avec le module de drm-gamma, il l’a désactivé.
Installez le nouveau noyau et rebootez
dpkg -i ../kernel-image-2.6.9-mm1-rt-v0.5.14_10.00.Custom_i386.deb
reboot
Si votre noyau ne démarre pas, vérifiez les options. Si tout se passe bien, il faut maintenant installer le
module realtime (voir chapitre 1.6 realtime security module)
22
Chapitre 6. Résumé de mon noyau realtime
A venir ....
23