Gnou

Le Blog de Thomas

Logiciels libres, informatique et autres ...

Jour 4, Samedi 23 Juillet: Conférences


Le samedi, dernier jour de conférences, avec moins de présentations que les autres jours : la première démarre à midi, et la dernière termine à 18h, sans ateliers en soirée après le repas.

NPTL Stabilization project


Ce sont deux français de chez Bull, Tony Reix et Sébastien Decugis, qui ont présenté le NPTL Stabilization project. En réalité, mon collègue et moi avions déjà rencontré Sébastien Decugis les jours précédents, il était venu avec nous au spectable son et lumière du Parlement. Cela nous a permis d'apprendre que Bull était une société toujours vivante, et que près de 400 développeurs travaillaient à Grenoble dans le département Recherche et Développement. En réalité, je savais déjà que Bull travaillait sur NPTL et sur NFSv4, mais je ne savais pas qu'il y avait encore autant de R&D. Bonne nouvelle, car nous manquons de grandes entreprises européennes dans le domaine de l'informatique !

NPTL, Native POSIX Thread Library est la nouvelle bibliothèque de thread remplaçant LinuxThreads. Le projet de stabilisation de Bull a pour objectifs de réduire le nombre de bugs dans cette bibliothèque, d'augmenter la couverture des tests, de rendre les tests plus simples à réaliser, et de permettre de tracer les évènements ayant lieu au sein de la bibliothèque.

Tests


Pour la partie test, ils ont tout d'abord analysé des logiciels utilisant la NPTL, comme Apache, Squid ou des applications HPC (High-Performance Computing). À partir de cette étude, ils ont classé les primitives de la NPTL en 4 sous-ensembles: les fonctions complexes et très utilisées (threads, mutexes notamment), les fonctions complexes moins utilisées (semaphores, conditions), les primitives peu utilisées (barrières) et les primitives très simples (attributs, appels systèmes). Cette classification a permis de déteminer les priorités sur les groupes de fonction à tester.

L'ambassade des États-Unis
L'ambassade des États-Unis

Pour implémenter leurs tests, ils ont utilisé la méthode du projet Open Posix Test Suite. Pour chaque primitive, ils ont tout d'abord étudié le standard POSIX afin de déteminer quelles sont les caractéristiques et les assertions que doivent vérifier chaque fonction. Pour certaines primitives, des clarifications ont été demandées afin que les prochaines versions de la norme soient plus précises. Ils ont donc écrit des tests de trois types : des tests de conformité (vérifier que la norme est respectée), des tests de scalabilité (mesurer le temps d'exécution d'une primitive) et des tests de stress. Ils ont détaillé sur leur forum leurs travaux fonction par fonction. Ces nouveaux tests ont été soumis au projet Open Posix Test Suite.

Pour faciliter l'analyse du résultat des tests, l'équipe de Bull a développé un outil appelé TSLogParser. Il s'agit d'une interface Web en PHP utilisant une base de données MySQL dans laquelle les résultats de tous les tests sont enregistrés. Grâce à cet outil, il est possible de comparer différentes exécutions de la suite de tests, voir quels tests ont réussi alors qu'ils échouaient avant et vice-versa. Cet outil est disponible sous licence GPL.

Grâce à ces tests, ils ont trouvé 22 bugs dans la Glibc, un bug dans le noyau, et 6 problèmes de clareté de la norme POSIX.

Outil de trace


Lorsque l'on développe des applications multi-threadées, on fait souvent face à des bugs assez délicats à résoudre, car ils sont liés à l'exécution en concurrence de plusieurs threads. De plus, l'ordonnancement des threads changeant à chaque exécution, les bugs disparaissent et apparaissent, rendant le déboguage cauchemardesque pour le développeur. D'autre part, le standard POSIX concernant les threads est assez délicat à comprendre, ce qui rend l'utilisation des bibliothèques comme NPTL peu aisée.

Pour aider le développeur, l'équipe de Bull a développé un outil permettant de tracer tous les évènements ayant lieu à l'intérieur de la bibliothèque NTPL. L'outil s'appelle PTT, Posix Thread Trace Tool, et est disponible sous licence LGPL sur SourceForge.
Le but est donc d'enregistrer les opérations de la bibliothèque au niveau de l'application et éventuellement d'enregistrer les appels internes de la NPTL. L'outil ne modifie pas le comportement de l'implication, et a un impact limité sur les performances. Il permet de réaliser des exécutions longues et de récupérer un grand volume de traces, sans en perdre.

L'outil se base tout d'abord sur une NPTL patchée à divers endroits pour intercepter les divers évènements (exécution d'un thread, prise d'un objet de synchronisation, etc.). Les traces sont enregistrées dans un buffer qu'un démon vient récupérer périodiquement. Le démon génère alors un fichier binaire, qui est exploitable soit au travers d'une interface en ligne de commande, soit au travers d'une interface graphique préexistante, Pajé. Le site de PTT donne un exemple, ainsi qu'une capture d'écran de Pajé. Les deux présentateurs ont réalisé une démonstration vraiment convaincante de cet outil: on visualise vraiment avec précision tout ce qu'il se passe, les prises de sémaphores, de mutex, l'ordonnancement des threads, etc.

À l'heure actuelle, PTT utilise un buffer par application. L'algorithme d'ajout d'une trace consiste à 1) réserver de l'espace dans le buffer de manière atomique, 2) écrire les données de la trace (de manière concurrente) et 3) marqué l'espace comme écrit de manière atomique. Cet algorithme est simple, robuste et efficace sur SMP. En revanche, il n'est pas suffisamment scalable sur des machines plus grosses, et le démon de récupération des traces peut de temps à autre bloquer les threads. L'amélioration de la scalabilité du système fait partie des évolutions à venir de l'outil.

Actuellement, PTT propose trois niveaux de trace: pas de trace, des traces seulement en entrée et sortie des primitives de la NPTL ou les traces complètes. Lorsque l'on utilise la NPTL patchée pour PTT, mais sans les traces, l'impact est minime (de l'ordre de 2%). Si l'on utilise les traces complètes sur une application à 128 threads, l'impact est plus important, de l'ordre de 25%.

Pour l'avenir de l'outil, les deux présentateurs ont parlé de :

Globalement, la présentation était plutôt convaincante. Le travail de test réalisé donne vraiment une impression de rigueur, et a permis de trouver quelques bugs. L'outil de trace, PTT, a l'air réellement utilisable et peut sans doute vraiment aider le développeur d'une application multithreadée.

Mercurial Tutorial


Le samedi matin, dans la petite salle réservée aux tutoriels, un tutoriel sur l'API NetPoll était prévu, ce qui m'intéressait moyennement. Finalement, à la sortie de la conférence sur NPTL, le programme avait été modifié, et c'est un atelier sur Mercurial qui avait lieu. Mon collègue et moi y sommes quand même allés, bien que nous ayons raté la première heure. J'ai trouvé un peu dommage d'avoir raté le début, car c'est vraiment un outil que j'aurai aimé maîtriser.

Une vue d'Ottawa depuis Gatineau, au Québec
Une vue d'Ottawa depuis Gatineau, au Québec

Pour ceux qui ne connaissent pas, Mercurial est un système de gestion de version distribué, comme Monotone, Arch, Svk, Darcs ou bien d'autres listés sur Wikipédia. À l'opposé de Subversion ou CVS, les systèmes de gestion de version centralisé dans lesquels toutes les opérations se réalisent à partir d'un dépôt unique des sources, les systèmes de gestion de version distribués permettent de créer de multiples dépôts, un peu partout. Cette propriété est vraiment intéressante lorsque l'on est plusieurs à travailler sur un projet, de manière décentralisée.

Le soucis, c'est que les outils sont très nombreux et je n'ai jamais donc décidé d'en tester un. D'autre part, les concepts sont un peu plus évolués que pour la gestion centralisée, et je n'avais pas eu le temps de me pencher sur la question. Un tutoriel sur un de ces outils était donc le bienvenu... mais j'ai du prendre le train en route.

L'orateur semblait être un des développeurs de Mercurial, et maîtrisait vraiment bien les outils, ses possibilités, ses limitations et les idées de développement futures. Lorsque nous sommes arrivés dans la salle, c'est surtout des échanges entre l'orateur et le public qui avaient lieu, mais ces échanges étaient constructifs et amenaient l'orateur à faire quelques démonstrations intéressantes.

Je ne vais pas détailler ici l'utilisation de Mercurial, car j'aimerais faire plus tard un billet plus complet sur son utilisation. En attendant, vous pouvez aller faire un tour du coté du tutoriel disponible sur le Wiki de Mercurial.

Précision importante: je ne soutiens aucunement que Mercurial soit LE système de gestion de version distribué. C'est simplement que c'est celui qui a été présenté. Peut-être que Darcs, Svk, Monotone ou d'autres sont plus aboutis, plus simples à utiliser, je ne sais pas. Vous pouvez aller faire un tour du coté de cette comparaison des différents système de gestion de version (centralisé ou distribué)... mais il n'y a pas Mercurial ;-)

The sysfs filesystem


Patrick Mochel avec sa jambe dans le plâtre a réalisé une présentation de sysfs.

Sysfs est un système de fichiers basé sur ramfs qui offre une interface utilisateur/noyau simple. Il permet de rendre visible à l'utilisateur différents objets du noyau, leurs attributs et leurs relations. Il est organisé selon une hierarchie stricte et offre une vue toujours à jour des objets. Tous les fichiers sont au format ASCII avec une valeur par fichier. Ces fichiers sont créés dynamiquement, et le système est prévu pour fonctionner avec les modules (chargement et déchargement) et pour fonctionner correctement en multi-thread.

Historiquement, le projet se nommait au départ ddfs, dont l'objectif était de permettre à l'utilisateur de visualiser l'arbre des périphériques disponibles sur la machine. À mesure que le modèle des pilotes de périphérique s'enrichissait, il est apparu nécessaire de pouvoir visualiser les bus, les classes de périphériques ainsi que les pilotes. À ce moment là, le projet s'appelait driverfs.

Finalement, d'autres sous-systèmes ont été intéressés par cette approche: driverfs ne servait plus seulement à représenter des périphériques, mais également des objets d'autres sous-systèmes. Il a alors été renommé sysfs, son nom actuel.

Dans le noyau, dès lors qu'une structure de type struct kobject est enregistrée, un répertoire apparaît dans sysfs. Ainsi dans sysfs, les répertoires représentent les objets du noyau, les fichiers représentent les attributs de ces objets et les liens symboliques représentent les relations entre les objets.

Prenons un exemple: mon interface réseau eth0. Dans /sys/class/net/eth0/, on trouve différents fichiers reprenant les propriétés de l'interface comme par exemple l'adresse MAC (dans /sys/class/net/eth0/address). On trouve également deux liens symboliques: device, qui pointe vers le périphérique PCI qui est en réalité la carte réseau utilisée pour l'interface eth0, ainsi que driver qui pointe vers le module noyau gérant cette carte PCI: 8139too :

thomas@crazy:/sys/class/net/eth0$ ls -l
-r--r--r--  1 root root 4096 2005-08-27 16:32 address
-r--r--r--  1 root root 4096 2005-08-27 16:32 addr_len
lrwxrwxrwx  1 root root    0 2005-08-27 16:32 device -> ../../../devices/pci0000:00/0000:00:0e.0/0000:02:07.0
lrwxrwxrwx  1 root root    0 2005-08-27 16:32 driver -> ../../../bus/pci/drivers/8139too
-r--r--r--  1 root root 4096 2005-08-27 16:32 features
-r--r--r--  1 root root 4096 2005-08-27 16:32 type
thomas@crazy:/sys/class/net/eth0$ cat address 
00:e0:4c:ec:32:3b

Sysfs a été intégré au noyau dès le 2.5.1 et est requis par udev. Il est également utilisé par lspci, cpufreq ou la modification des paramètres des périphériques bloc.

Patrick a ensuite listé quelques-uns des apports de sysfs :

En revanche, Patrick a noté un certain nombre de problèmes :

Dans le futur, le développeur aimerait répondre aux attentes de catégories spécifiques d'utilisateurs :

À la fin de cette présentation, le développeur de sysfs a donné une liste des tâches à réaliser, en les classant en niveau de difficultés. Je n'ai pas noté ces tâches, mais il semblerait qu'il y ai des choses à faire et à améliorer du coté de sysfs.

À noter que le papier de Patrick Mochel ne résume pas exactement sa conférence: il s'agit plus d'un guide de programmation sysfs, qui peut être une documentation très intéressante si vous avez besoin de bricoler avec ce système de fichiers.

Sur la forme, la présentation de Mochel était très vivante, ponctuée de quelques blagues. Le genre de conférences auquel on s'intéresse même si a priori le sujet ne vous passionne pas forcément.

Keynote Address


J'ai rédigé le compte-rendu de cette conférence près d'un mois après l'évènement, et j'avais seulement pris quelques notes. Je regrette un peu de ne pas l'avoir fait plus tôt, car il va manquer beaucoup d'informations sur cette conférence passionante. Il y a quelques jours, j'ai demandé à l'orateur si il avait prévu de mettre ses transparents en ligne, j'espère qu'il pourra le faire.

Andrew Morton et Dave Jones
Andrew Morton et Dave Jones

La Keynote Address est la dernière conférence du symposium, elle est l'unique conférence programmée à ce moment-là, et clotûre le congrès. Une tradition veut que l'orateur de la Keynote de l'année précédente introduise l'orateur de cette année, et qu'à la fin de la Keynote soit annoncé l'orateur de l'année suivante.

Cette année, c'est Andrew Morton, le mainteneur de la très importante branche -mm du noyau qui introduisait l'orateur. C'est donc au milieu d'un concentré de blagues et de jeux de mots relativement incompréhensibles pour un francophone moyen qu'il a introduit Dave Jones. Dave Jones est le mainteneur des noyaux des distributions RedHat. Sa présentation était sous-titrée « The need for better bug reporting, testing, and tools », ce qui laissait présager une conférence très intéressante.

Il a commencé par une petite introduction avec des citations assez amusantes. Tout d'abord :
I don't think you have a future in the computing industry
c'est ce que lui avait dit son professeur d'informatique une quinzaine d'années auparavant. Comme il l'a dit: « Tout le monde peut se tromper ». Et il poursuit avec 6 ou 8 citations de Linus. Ça commence en 1996, avec Linus qui dit que bientôt, plus rien d'excitant ne se passera au niveau du noyau, que ce sera devenu une commodité sans intérêt. Et Dave continue en citant Linus, au fil des années, de 1997 à 2005, on voit sa position qui évolue, pour finalement arriver à dire complètement l'inverse de ce qu'il avait dit 10 ans plus tôt : il se passe des choses excitantes au niveau du noyau aujourd'hui. « Tout le monde peut se tromper ». Le travail des recherches des citations est impressionant, et la façon de les amener une à une rendait la chose vraiment amusante.

Ensuite, il a plus sérieusement entamé sa présentation, visant à détailler en quoi le mode de développement du noyau affecte RedHat et la maintenance de ses noyaux. C'est donc un point de vue un peu différent de celui d'un développeur noyau pur qu'a donné Dave Jones pendant ce keynote.
Le première problème qu'a évoqué Dave est le problème des interfaces qui changent entre deux versions du noyau (même des versions “mineures”). Par exemple, l'interface ALSA a changé en 2.6.11, il y a des problèmes avec l'interface Ipsec ou l'interface pour le wireless. Ces changements d'interface multiplient les problèmes que peuvent rencontrer les utilisateurs.

Le second problème évoqué est celui des drivers, pour lesquels il n'y a pas suffisamment de test de regression selon Jones. Il a souvent rencontré des cas de drivers qui fonctionnaient, puis qui subitemment ne fonctionnent plus, sans que personne ne s'en soit aperçu. Comme il l'a expliqué, le soucis c'est que les drivers sont très difficiles à tester, car cela nécessite d'avoir le matériel disponible, et ce type de test prend beaucoup de temps. Ainsi, lorsqu'il y a un changement de l'API interne du noyau qui nécessite des modifications dans les drivers, les modifications sont réalisées à l'aveugle: on modifie le driver, on vérifie que ça compile... et on ne teste pas, parce que le matériel n'est pas disponible. Il a également indiqué que la vitesse d'intégration des patches s'était accrue pour atteindre parfois 4000 changesets par mois, et que certains n'étaient sans doute pas relus.

À l'heure actuelle, des tests de stress, des fuzz tests et des tests de performances sont réalisés sur le noyau, mais il n'y a pas de tests de régression, de tests des chemins de traitement d'erreurs ou des tests de couverture de code. D'après Jones, trop peu de gens testent les versions -rc des noyaux, et du coup, les problèmes ne sont remontés par les utilisateurs que lors de la sortie de la version officielle.
À propos de la remontée des problèmes par les utilisateurs, Dave Jones dispose d'une bonne expérience, puisqu'il doit gérer tous les bugs remontés sur les noyaux de la distribution RedHat. Durant la conférence, il a dressé un profil psychologique assez amusant de quelques reporteurs d'anomalies :

Pour donner une idée du problème, Jones a donné quelques chiffres pour la Fedora Core 2. Il restait 612 bugs sur la Fedora Core 2 concenrant le noyau. Dave les a tous fermés en demandant si le problème était toujours présent, seuls 10 bugs ont été réouverts. Pour donner un ordre d'idée, il avait le jour de la conférence environ 960 bugs concernant le noyau sur Fedora Core 3 et 4.

D'expérience, Dave Jones a pu dire que la plupart des bugs rencontrés sont des bugs upstream, c'est-à-dire qu'ils ne sont pas liés au packaging, mais qu'ils sont bien présents dans le noyau lui-même. Il y a alors de grandes chances que les utilisateurs des autres distributions rencontrent les mêmes problèmes.

Dans le cas où le bug concerne upstream, le processus pour partager le bug est manuel, mais Dave Jones aimerait bien un système où les bugs pourraient être remontés automatiquement upstream, tout en gardant l'historique du bug. Bref, des Bugzilla qui communiquent, par exemple avec XML-RPC.

La salle est comble pour ce keynote
La salle est comble pour ce keynote

C'est intéressant, car c'est une problématique que j'avais déjà soulevé dans un billet au mois de janvier, et j'en avais reparlé un peu plus tard, car Canonical, la société derrière Ubuntu avait lancé un projet appelé Malone, qui est justement un bug-tracker collaboratif. C'est une problématique qui a également été discutée récemment au sein de Debian, comme l'évoque les nouvelles hebdomadaires du 16 août. Ce débat a fait suite à l'affichage d'un message lors du report d'une anomalie sur Mozilla Firefox. Ce message indiquait que dans le cas d'une anomalie non liée au packaging, il fallait reporter soi-même l'anomalie dans le Bugzilla de Mozilla et dans le bugtracker de Debian. Le débat montre que le problème de communication des bugs entre le niveau “distribution” et le niveau “upstream” existe bien, et que des outils comme Malone seraient nécessaires. Quid de leur mise en place ?

Personnellement, J'ai fait part par courrier électronique de l'existence de Malone à Dave Jones puisque cela semblait répondre à ses besoins, mais je n'ai jusqu'ici pas eu de réponse. Mon courrier électronique a vraisemblablement dû se perdre dans les milliers de bug-reports qui doivent innonder sa boîte aux lettres.

Dave Jones, très en contact avec les utilisateurs par son travail de mainteneur, a noté que l'utilisation des drivers binaires étaient en baisse, mais que l'utilisation de helpers comme ndiswrapper, ndisulator ou driverloader. Pour Dave Jones, l'utilisation de ce type de solutions est contre-productif. D'un coté, ça incite moins les développeurs à développer des pilotes libres, et de l'autre coté, ça dilue le message qu'on essaie d'envoyer aux constructeurs en demandant la publication des spécifications ou des pilotes libres. Malheureusement, les distributions commencent à distribuer en standard ce type d'outils, dont l'utilisation risque de se généraliser.
Dans la dernière partie de sa présentation, Dave Jones a dit qu'il trouvait nécessaire de disposer de plus d'outils de tests, et de les utiliser plus massivement. Il pense par exemple à valgrind, oprofile ou à l'analyse statique de code. D'après Dave, Le problème avec l'analyse statique de code, c'est que les outils comme lclint/splint ne marchent pas out-of-the-box et du coup, personne ne les utilise. De plus, lclint génère beaucoup de faux-positifs, Dave citant l'exemple d'un code de 43.000 lignes générant 50.000 lignes de sortie lclint. Il y a beaucoup de travail manuel à réaliser qui complique l'utilisation de lclint et rebute les développeurs. L'autre outil d'analyse de code est sparse, développé par Linus, mais Dave trouve qu'il est encore trop complexe à utiliser. Il a bien évidemment cité les outils de Coverity qui ont détecté quelques vrais problèmes dans le noyau, mais Jones regrette que ces outils ne soient pas libres.

La soirée de cloture
La soirée de cloture

Personnellement, j'ai trouvé cette conférence vraiment excellente: le point de vue d'un mainteneur, en contact avec les utilisateurs, est très intéressant, et montre qu'il y a beaucoup à faire pour améliorer les choses, aussi bien sur les tests que sur la gestion des anomalies. Même si mon compte-rendu ne rend peut-être pas bien compte de l'intérêt de cette conférence, j'ai trouvé que c'était l'une des plus intéressantes de tout le symposium.

Soirée de cloture


Le samedi soir avait lieu la soirée de cloture, dans un bar d'Ottawa. L'occasion de réunir tout le monde autour d'un bar ouvert (boissons gratuites à volonté). Comme toujours, ces pendants ces moments-là que des contacts se font, qu'on commence à discuter avec du monde. Ça m'a vraiment fait regretter de n'avoir pu aller à la première soirée, avant le symposium, car elle aurait permis de connaître un peu plus de monde dès le départ.
Cette soirée fût l'occasion de quelques discussions avec un développeur de LTSP, un ingénieur s'occupant des tests autour du noyau Linux chez IBM, d'un administrateur système norvégien ou d'un ingénieur en Linux embarqué du Canada.
Il y a un commentaire sur cette page. [Afficher commentaires/formulaire]