Historique: Temps-réel pour les processus IRQ
Aperçu de cette version: 77
Optimisations du système
---------
AVANT TOUT
• Le portail des débutants
• Le temps réel pour les applications
---------
ENSUITE
• Les disques durs et hdparm
• LE watchdog
• Latence des périphériques PCI
---------
LE NOYAU
• Le noyau
• Le noyau Temps-Réel
• Compiler un noyau 2.6 RT
---------
PLUS LOIN ENCORE
• Interruption matérielle - IRQ : les bases
• Gestion des IRQ
• La gestion des priorités
|
! Page en cours de germination ! (attention au gazon s'il-vous-plait) |
Table des matières
Cette page va décrire les démarches à effectuer pour configurer l'accès temps-réel des applications et du matériel pour un noyau temps-réel.
Lorsque vous utilisez un noyau temps-réel, vous devez non seulement configurer la priorité temps-réel de vos applications (voir la page Applis RT), mais aussi la priorité de votre carte son et de l'horloge système. Ceci est capital car donner aux applications une priorité supérieure à celle de votre matériel audio peut vous causer bien des problèmes !
Accès temps-réel applications
Démarrez un terminal.Vérifiez pour commencer que vous avez bien suivi la procédure qui permet de configurer l'accès temps réel pour les applications (voir Applis RT).
Pour cela, la commande
grep sur le fichier de configuration de PAM fait notre affaire :imprimer rtprio
Copy to clipboard
~~blue:#~~ grep rtprio /etc/security/limits.conf @audio - ~~red:rtprio~~ 90
rtprio est la valeur de priorité maximale que vous avez fixée pour les applications audio (les "clients" de JACK)
➡️ Si besoin se reporter à la page Applis RT pour localiser le fichier de configuration de PAM.
Vérifiez aussi que vous êtes dans le groupe audio
lister les groupes
Copy to clipboard
~~blue:#~~ groups votre_utilisateur cdrom ... audio ...
Enfin, vérifiez que vous démarrez JACK avec une valeur de priorité de 70 (-P70).
à vérifier
Accès temps-réel IRQ
Pourquoi ?
Vous l'avez compris, brider la priorité des applications à 90 nous laisse un peu de marge pour placer les IRQ nécessaires au dessus.Heureusement pour nous, le noyau Linux peut contrôler l'attribution de la priorité des IRQs par des processus, que nous appellerons "processus IRQ".
Pour un noyau standard (module CONFIG_PREEMPT_DESKTOP), la priorité des "processus IRQ" est, par défaut, supérieure à celle des autres applications, et elle nous est invisible/intouchable.
Mais avec le patch temps-réel du noyau temps-réel (module CONFIG_PREEMPT_RT), on peut modifier la priorité des "processus IRQ" facilement ce qui nous apporte une grande souplesse et c'est tout bon pour nous ! Ceci dit, cette configuration est un passage obligé car : les "processus IRQ" qui nous intéressent ont une priorité faible par défaut (autour de 50), ce qui peut créer des conflits avec les applications audio :
Exemple de discussion entre 2 processus audio : (mauvaise configuration)
- jacques_kit@70 : laiiiiiiiisse passer !
- alsa_driver@50 : attend je...
- jacques_kit@70 : pousse toi jte dit je vais louper mon bus !
- alsa_driver@50 : attention !!...
... vous devinez le reste de la scène : jacques_kit@70 pousse alsa_driver@50 dans le fossé ...
... En croyant pouvoir "choper son bus", mais sans savoir que ...
... bah c'était lui ...
... le conducteur du bus ! 🙄.
Résultat de l'expérience : blocage total du réseau de bus, autrement connu sous le nom de x-runs.
voir la priorité des "processus IRQ"
Savoir "quel processus" est réglé sur "quelle priorité" est facile, une simple commande linux de base ps argumentée comme il faut suffit :
lister les processus :
Copy to clipboard
~~blue:#~~ ps -eo pid,class,rtprio,cmd
ps imprime des "process snapshot" et dévoile même les processus critiques avec l'option -e
l'option -o nous permet d'avoir des informations de notre choix en plus.
La liste peut être (très) longue en fonction du système utilisé, ajoutons un filtre pour ce qui nous intéresse :
lister les ~034~processus IRQ~034~
Copy to clipboard
~~blue:#~~ ps -eo pid,class,rtprio,cmd | grep -i IRQ
| grep -i cherche le mot "IRQ" dans le résultat de la commande précédente et affiche les occurences
ps -eo pid,class,rtprio,cmd | grep -i IRQ
[sudo] password for olinuxx:
4 FF 49 [sirq-high/0]
5 FF 49 [sirq-timer/0]
6 FF 49 [sirq-net-tx/0]
7 FF 49 [sirq-net-rx/0]
8 FF 49 [sirq-block/0]
9 FF 49 [sirq-tasklet/0]
10 FF 49 [sirq-sched/0]
11 FF 49 [sirq-hrtimer/0]
12 FF 49 [sirq-rcu/0]
18 FF 49 [sirq-high/1]
19 FF 49 [sirq-timer/1]
20 FF 49 [sirq-net-tx/1]
21 FF 49 [sirq-net-rx/1]
22 FF 49 [sirq-block/1]
23 FF 49 [sirq-tasklet/1]
24 FF 49 [sirq-sched/1]
25 FF 49 [sirq-hrtimer/1]
26 FF 49 [sirq-rcu/1]
206 FF 50 [irq/9-acpi]
549 FF 50 [irq/21-sata_uli]
568 FF 50 [irq/14-pata_ali]
569 FF 50 [irq/15-pata_ali]
655 FF 80 [irq/23-ehci_hcd]
660 FF 80 [irq/17-ohci_hcd]
664 FF 79 [irq/18-ohci_hcd]
668 FF 78 [irq/19-ohci_hcd]
677 FF 75 [irq/1-i8042]
687 FF 50 [irq/8-rtc0]
904 FF 50 [irq/20-eth0]
907 FF 50 [irq/23-ohci1394]
1244 FF 50 [irq/7-parport0]
1362 FF 50 [irq/22-HDA Inte]
1892 FF 50 [irq/17-radeon@p]
10231 TS - grep --color=auto -i IRQ
Voilà enfin la liste qui nous intéresse ! Mais attendez un instant et observez le résultat de votre commande : où est "la carte son" ? et "l'horloge système" ?
La liste que vous voyez est composée dans l'ordre de (pour chaque processus) :
numéro identifiant, classe "temps-réel", priorité "temps-réel" (TS pour standard/SCHED_OTHER et FF pour SCHED_FIFO/temps-réel) et enfin la ligne de commandes invoquée.
...to be continued
l'horloge système haute résolution : rtc0
les cartes sons , trouver le bon numéro d'irq avec /proc/interrupts
Les nœuds pci, changer les irq ?
modifier les priorités
automatiser tout ca
Présentation
Il s'agit "simplement" d'utiliser un script permettant de prioriser des IRQ handlers (pour les utilisateurs du groupe "audio"). Le "programme" se compose de 2 fichiers : un script d'initialisation et un fichier de configuration. Nous rappelons ici que l'utilisation d'un noyau RT (c'est à dire un noyau patché avec le patch RT) est indispensable (usage de threads pour la gestion des IRQ).
Gentoo
Le plus simple est d'utiliser l'overlay "pro audio production applications" (voir page gentoo)Copy to clipboard
echo "sys-process/rtirq ~x86" >> /etc/portage/package.keywords emerge rtirq rc-update add rtirq default
Ubuntu
Pour les utilisateurs d'Ubuntu, un paquet du doux nom dertirq-init existe.Compilation
Si un paquet n'existe pas pour votre distribution, vous pouvez toujours le compiler/installer à la main ! Nous allons voir ceci ici.L'installation n'est pas trop compliquée ! Vous trouverez l'archive et des instructions (en anglais) ici :
http://lalists.stanford.edu/lau/2005/11/0459.html ou mieux ici : http://www.rncbc.org/jack/ (en bas de page) pour la toute dernière version.
Pour résumer, téléchargez l'archive "rtirq-20050914.tar.gz" et décompressez-là :
Copy to clipboard
wget http://lalists.stanford.edu/lau/2005/11/att-0459/rtirq-20050914.tar.gz tar -zxvf rtirq-20050914.tar.gz
Placez les 2 fichiers au bon endroit et avec les droits corrects (en super utilisateur) :
Copy to clipboard
cp rtirq.sh /etc/init.d/rtirq chmod 0755 /etc/init.d/rtirq cp rtirq.conf /etc/sysconfig/rtirq chmod 0644 /etc/sysconfig/rtirq
Intégrez le script dans votre distribution en tant que script d'initialisation (très variable d'une distribution à l'autre)
Pour Gentoo :
Copy to clipboard
rc-update add rtirq default
Pour Mandriva (voir aussi "drakxservice") :
Copy to clipboard
chkconfig --level 5 rtirq on
Pour Redhat ou Fedora :
Copy to clipboard
chkconfig --add rtirq
Pour Ubuntu :
Copy to clipboard
update-rc.d rtirq defaults
man chkconfig (pour les autres ❗
Le script utilise ensuite les commandes classiques des scripts d'initialisation de votre distribution :
Copy to clipboard
/etc/init.d/rtirq start (pour démarrer) /etc/init.d/rtirq stop (pour arrêter) /etc/init.d/rtirq status (devinez !)
La configuration se fait en modifiant le fichier
/etc/sysconfig/rtirq ( /etc/conf.d/rtirq sous Gentoo) qui est plutôt bien documenté. Il est important de s'assurer au préalable de l'absence de conflit d'IRQ, en particulier pour les périphériques listés dans "RTIRQ_NAME_LIST", en utilisant la commande cat /proc/interrupts (voir la page IRQ).Exemples
Pour les utilisateurs de cartes firewire, voir la page suivante, sur le site du projet Freebob : http://freebob.sourceforge.net/index.php/System_Configuration_Hints.Vous trouverez ici comment régler les priorités afin de favoriser votre carte FireWire : http://freebob.sourceforge.net/index.php/IRQ_Threading_and_Priorities.
Voir aussi : http://alsa.opensrc.org/Rtirq.
Rtirq (repris de la doc ffado)
Installation :
- debian 6 squeeze : voir ici
- Ce script se trouve ici : IRQ Threading and Priorities.
Une fois ce script installé, voici les recommandations du site officiel de FreeBob (merci Pieter Palmers) pour le fichier de configuration rtirq :
Éditez (en mode super utilisateur) le fichier :
et remplacer le contenu par ce qui suit :
Copy to clipboard
#!/bin/sh #Copyright (c) 2004-2005 rncbc aka Rui Nuno Capela. #All rights reserved. #/etc/sysconfig/rtirq #Configuration for IRQ thread tunning, #for realtime-preempt enabled kernels, #IRQ thread service names #(space separeted list, from higher to lower priority). RTIRQ_NAME_LIST="rtc ohci1394 snd usb i8042" #Highest priority. RTIRQ_PRIO_HIGH=80 #Priority decrease step. RTIRQ_PRIO_DECR=5 #Whether to reset all IRQ threads to SCHED_OTHER. RTIRQ_RESET_ALL=0 #On kernel configurations that support it, #which services should be NOT threaded #(space separated list). RTIRQ_NON_THREADED="rtc ohci1394 snd"~/
ensuite si vous lancer (en mode super-utilisateur) le script
Copy to clipboard
/etc/init.d/rtirq start
vous devriez obtenir quelque chose comme :
Copy to clipboard
rtirq: start [rtc] irq=8 pid=233 prio=80: OK. rtirq: start [ohci1394] irq=11 pid=1177 prio=75: OK. rtirq: start [snd] irq=9 pid=15 prio=70: OK. rtirq: start [i8042] irq=1 pid=323 prio=60: OK. rtirq: start [i8042] irq=12 pid=251 prio=59: OK.
Cela signifie que ohci à une priorité de 75. Il ne faut pas donner à jackd / libfreebob une priorité supérieure à OHCI.
Pour ce réglage, préférez un écart en OHCI et JACK de 10. donc une priorité de 65 ou 60 à JACK est bonne.
La priorité de JACK doit être inférieure au périphérique audio mais supérieure aux autres.
En savoir plus
liens :le sujet de forum lié à cette page : http://www.linuxmao.org/tikiwiki/tiki-view_forum_thread.php?forumId=8&comments_threshold=0&comments_parentId=24403&comments_offset=60&comments_per_page=30&thread_style=commentStyle_plain
définition IRQ : http://www.pcmus.com/irq.htm
le module CONFIG_RT_GROUP_SCHED : http://www.mjmwired.net/kernel/Documentation/scheduler/sched-rt-group.txt
comprendre la basse latence : Hardware interrupts, schedulers : http://ccrma.stanford.edu/planetccrma/software/understandlowlat.html
schedulers and policies : http://ccrma.stanford.edu/planetccrma/man/man2/sched_setscheduler.2.html
IRQ Priorities : vue générale et utilisation de chrt http://tapas.affenbande.org/wordpress/?page_id=40
configuration du systeme par linuxmusicians : http://wiki.linuxmusicians.com/doku.php?id=system_configuration#priorities
IRQ Priorities How-To :
- Note de rédaction (olivier) : Je pense qu'il faut déjà passer par la page IRQ avant de venir sur cette page qui doit parler plus précisément de la gestion des IRQ par rt-irq. (éventuellement même la renommer).