Gnou

Le Blog de Thomas

Logiciels libres, informatique et autres ...

L'actualité du noyau


Depuis le début de la semaine, j'essaie de suivre le développement du noyau Linux en lisant quelques messages de la Linux Kernel Mailing List au travers d'un newsgroup. Ça faisait plusieurs années que je n'avais pas utilisé de newsgroups, les délaissant au profit des listes de diffusion. Mais finalement, pour une liste avec un traffic comme la LKML (plusieurs centaines de courriers électroniques par jour), les newsgroups sont une bonne idée, car ils évitent de surcharger une boîte aux lettres vers laquelle affluent déjà de nombreux courriers électroniques.

Durant ces lectures, j'ai pu y découvrir plusieurs choses intéressantes:


Ce travail a reçu un accueil mitigé. Certains considèrent cela comme inutile, car les utilisateurs ayant besoin d'aide pour configurer leur noyau devraient utiliser les noyaux pré-compilés de leur distribution. D'un autre coté, certains ont rappelé que les développeurs du noyau souhaitaient que les versions vanilla officielles soient plus testées, et qu'il fallait donc faciliter l'accès à la compilation du noyau.

Dans tous les cas, même pour les power-users, ce genre d'automatisation peut-être assez pratique. Combien de fois n'éprouve-t-on pas des difficultés à trouver quel module du noyau correspond à tel ou tel périphérique. Une opération qui peut très bien être automatisée.


À noter que Linus développe déjà un outil d'analyse statique du code appelé Sparse et qui permet de vérifier un certain nombre de choses dans les sources du noyau. Ces outils d'analyse statique semblent décidement être à la mode, puisque Rusty Russell en a parlé à l'Ottawa Linux Symposium, et Dave Jones également dans sa Keynote.

Je ne suis absolument pas un expert dans le domaine de la compilation, mais je pense que disposer d'un analyseur statique de code qui comprend correctement toute la grammaire du C, avec toutes les extensions de Gcc ne doit pas être évident. Du coup, je trouve dommage d'avoir ces duplications d'efforts: il y a sparse, il y a c, mais également ncc, un compilateur destiné à générer des informations pour réaliser des graphes d'appel. Ne serait-il pas possible d'avoir un seul analyseur statique de code qui sache parfaitement parser le langage C, auquel on puisse « brancher » différents outils de vérification. Ainsi, la partie « analyse de la grammaire C » serait factorisée et donc serait sans doute de meilleure qualité, et cela faciliterait le développement de nouveaux types de vérification. Pour donner une illustration de la difficulté de bien analyser un source en C, j'ai découvert un bug dans ncc qui le faisait purement et simplement segfaulter avec un bout d'assembleur... alors que ncc passe sans problème sur le noyau Linux. Avoir un analyseur qui marche vraiment dans tous les cas est donc difficile, alors autant regrouper les efforts.




En même temps que j'ai décidé d'essayer de suivre un peu plus l'actualité du noyau, j'ai décidé d'essayer de tester les versions release candidate de ce dernier. J'ai donc téléchargé le patch de cette 2.6.14-rc1, qui s'applique sur le noyau 2.6.13 lui-même. En effet, bien qu'un noyau 2.6.13.1 soit sorti avant le 2.6.14-rc1, le développement du noyau se poursuit à partir du 2.6.13 officiel: les 2.6.x.y ne sont que des versions stabilisées du noyau 2.6.x, maintenues dans une branche séparée.

La configuration de ce 2.6.14-rc1 s'est déroulée très rapidement et sans encombre grâce à make oldconfig. Avec cette cible, seules sont posées des questions concernant les options de compilation ayant changé. La compilation s'est bien déroulée et le tout fonctionne très bien, aucun plantage, et j'utilise donc ce noyau de manière courante. D'autre part, j'ai mis en place le système KLive proposé par Andrea Arcangeli. Il s'agit d'un petit script qui tourne en tâche de fond, et qui va régulièrement informer un serveur de la version du noyau utilisée, de l'uptime, et de quelques informations sur la configuration de la machine. L'objectif de ce projet est de répondre à une question que se posait les développeurs noyau à Ottawa cet été: combien de personnes testent les noyaux -rc. J'ajoute donc ma toute petite pierre à cet édifice en signalant que j'utilise le 2.6.14-rc1 avec succès. Vous pouvez faire de même ;-)



Le processus pour la sortie d'un 2.6.x.y semble être le suivant: Chris Wright poste une liste de patches (ici au nombre de 11), en demandant l'avis des autres développeurs noyau, et en leur demandant de signaler d'autres patches qui auraient vocation à être intégrés. Chris précise également à la fin de son courrier : « Responses should be made by Sat Sep 17 01:00 2005 UTC. Anything received after that time, might be too late.». Il semble qu'il souhaite maintenir une certaine fréquence dans la sortie des versions 2.6.x.y et impose donc des dates limites. Tout ce qui n'est pas intégré dans 2.6.x.y pourra l'être dans 2.6.x.(y+1) de toute façon. À partir de ce post de Chris, vous pouvez suivre l'organisation et le déroulement de la sortie de ces versions stabilisées du noyau.


Le read-ahead est un mécanisme qui permet d'améliorer les performances en lecture depuis les périphériques de stockage. Il part du principe que le plus souvent, lorsqu'une application lit une petite quantité de données depuis un disque dur, il y a de fortes chances pour qu'elle accède à la suite de ces données (par exemple parce qu'elles sont dans le même fichier). Par exemple, si une application lit un fichier 4 Ko par 4 Ko un fichier de 16 Ko, et qu'on lit naïvement sur le disque dur, il faudra réaliser 4 requêtes de lecture. En étant un peu plus intelligent, on peut lire en avance (d'où le terme de read-ahead), ce qui a un double avantage. Tout d'abord, on réalisé une seule requête de lecture au lieu de quatre: il n'est donc nécessaire de calibrer la tête de lecture qu'une seule fois. En effet, les disques durs ont la propriété d'être lent pour le déplacement de leur tête de lecture, et d'offrir un bon débit une fois la tête positionnée. Ainsi, lire 16 Ko au lieu de 4 Ko ne prend que très peu de temps supplémentaire, puisque la majorité du temps est passé à déplacer la tête. Le second avantage est que grâce à cette lecture en avance, les données à lire sont présentes en mémoire avant même que l'application ne les demande.

Le problème est bien entendu de calibrer cette lecture en avance, pour qu'elle lise suffisamment (pour qu'elle soit utile), mais pas trop (pour ne pas qu'elle dégrade les performances en chargeant des données qui ne seront jamais utilisées). Et évidemment, le paramétrage de ce read-ahead dépend du type d'entrées-sorties réalisées par l'application. Si elles sont purement séquentielles (bloc N, puis bloc N+1, puis bloc N+2), alors il vaut mieux augmenter le read-ahead. En revanche, si les requêtes d'entrées-sorties concernent des blocs aléatoires sur le disque, alors il vaut mieux diminuer le read-ahead.

Le travail de WU Fengguang propose donc d'adapter le read-ahead en fonction du contenu du page cache. J'avoue ne pas avoir eu le temps de lire et de comprendre en détail le fonctionnement de son mécanisme d'adaptation, mais celui-ci est détaillé avec précision dans le courrier électronique et accompagné de nombreux benchmarks.


spufs s'intègre dans le portage de Linux sur le processeur Cell. Celui-ci, qui sera utilisé dans la Playstation 3, propose une architecture assez originale. Il est constitué d'un PowerPC 64bits "classique", mais également de 8 unités spécialisées appelées Synergistic Processing Elements (SPE). Comme l'explique la page Wikipédia, chaque SPE est un petit processeur RISC disposant de 256 Ko de mémoire cache, qui permet d'exécuter du code en parallèle du processeur principal, le PowerPC 64 bits.

Pour que le portage de Linux soit complet, il fallait non seulement que le noyau Linux fonctionne sur le PowerPC 64 bits, mais également qu'il fournisse une interface de programmation pour ces SPE, afin que des applications tournant sur le processeur principal puissent lancer des traitements spécifiques en parallèle dans les SPE. Pour cela, les ingénieurs chargés du portage ont choisi d'utiliser un système de fichiers baptisé spufs. Dans ce système de fichiers spécialisé, chaque répertoire représente un SPE, et les différents fichiers contenus dans ce répertoire permettent de manipuler ce SPE. La page consacrée à ce sujet sur le site d'IBM donne l'exemple suivant:

$ mkdir /spu/myspu-12345
$ ls -lR /spu/
spu/:
total 0
drwxr-xr-x  2 arnd arnd 4096 Jun 17 21:00 my-spu-12345

spu/my-spu-12345:
total 0
-r--r-----  1 arnd arnd      0 Jun 17 21:01 ibox
-r--r-----  1 arnd arnd      0 Jun 17 21:01 mbox
-rw-rw----  1 arnd arnd 262144 Jun 17 21:01 mem
-rw-rw----  1 arnd arnd   2048 Jun 17 21:01 regs
-rw-rw----  1 arnd arnd      0 Jun 17 21:01 run
--w--w----  1 arnd arnd      0 Jun 17 21:01 wbox

Le fichier /spu/myspu-12345/mem représente le contenu des 256 Ko de mémoire cache d'un SPE. En réalisant des écritures dans ce fichier, on peut donc charger le contenu de la mémoire du SPE avec du code et des données. Je trouve ça assez amusant comme fonctionnement ;-)

Voilà, ce sera tout pour l'actualité du noyau. N'hésitez pas à poster vos remarques et suggestions dans les commentaires, en particulier sur ce qui vous a intéressé ou pas intéressé. On sait jamais, peut-être que je trouverais le temps de faire d'autres résumés de temps à autre.
Il y a 12 commentaires sur cette page. [Afficher commentaires/formulaire]