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

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.

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: off
  1: more preemption + max_sectors_kb
  2: more preemption + max_sectors_kb + redirect softirqs
  3: 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

 /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

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.