[TECHNIQUE] La refonte de l’ordonnanceur de tâches
L’ordonnanceur actuel de la série des noyaux 2.6 emploie des heuristiques compliquées afin d’accorder un bonus aux processus interactifs qui seraient autrement lésés face aux processus consommateurs de CPU. Ces heuristiques se fondent sur une comptabilisation pour chaque processus du temps pendant lequel ils dorment. Un processus dormant à répétition signifie souvent qu’il effectue des opérations d’entrées/sorties (ces opérations étant une source importante entraînant un réordonnancement) ou du moins qu’il ne se comporte pas de façon "égoïste" en ne consommant pas entièrement son timeslice (c’est-à -dire la tranche de temps d’exécution accordée à un processus) dès que l’ordonnanceur lui en octroie un nouveau. De plus, l’évaluation de l’interactivité des processus, au travers de ces statistiques sur leur temps de sommeil, s’avère faussée avec un nombre important de processus sur le système. En effet, l’évaluation du comportement d’un nombre important de processus perd en fiabilité lorsque le temps de l’évaluation est borné, ce qui est le cas avec l’ordonnanceur actuel en O(1). Aussi, établir ces statistiques demande une période d’apprentissage. Plus elle est courte, plus les tâches interactives peuvent être incorrectement identifiées comme des tâches consommatrices de CPU. Plus elle est longue, plus les tâches interactives vont attendre longtemps avant d’obtenir une faible latence d’ordonnancement et un partage équitable du CPU (avec les tâches très gourmandes en CPU). Ainsi, Con Kolivas a proposé son Staircase Deadline (SD) Scheduler qui, de par sa conception, favorise les tâches interactives sans besoin d’heuristiques. Après deux années de recherche, Con a annoncé sur la LKML, le 4 mars 2007, la première version de son ordonnanceur alors nommé RSDL (Rotating Staircase DeadLine). Après de nombreux tests, certaines charges se sont révélées moins bien gérées avec ce nouvel ordonnanceur qu’avec l’ancien. Le problème vient des applications utilisant laLe Staircase Deadline (SD) CPU Scheduler
L’ordonnanceur SD est conçu afin de choisir en O(1) une tâche à exécuter (l’ordonnanceur actuel se comporte également de cette manière). Son architecture empêche la survenance de famine. Il impose de plus un partage équitable du ou des processeurs disponibles, fondé sur la priorité statique attribuée via la commandePRIORITY: 0..................20.................39 nice -20 0000000000000000000000000000000000000000 nice -10 1000100010001000100010001000100010010000 nice 0 1010101010101010101010101010101010101010 nice 5 1011010110110101101101011011010110110110 nice 10 1110111011101110111011101110111011101110 nice 15 1111111011111110111111101111111011111110 nice 19 1111111111111111111111111111111111111110Nous voyons ici qu’un processus de nice -20 s’exécute dans toutes les priorités alors qu’un processus de nice 19 s’exécute seulement dans une priorité lors d’une époque majeure. Nous l’avons dit en début de brève, cet ordonnanceur ne sera probablement pas celui à remplacer l’actuel. Son évolution, cependant, continue toujours afin de "concurrencer" CFS pour que ce dernier puisse avoir un partenaire avec qui se comparer et ainsi être amélioré par la communauté des développeurs du noyau. Alors que SD reprend beaucoup de l’ordonnanceur actuel, CFS met fin à l’utilisation du couple des tableaux actif et "expiré", et s’appuie sur une toute autre structure de données : un arbre équilibré de type red-black tree. Nous reviendrons sur cela dans un prochain numéro.
[Actualité] Linux Storage & Filesystem Workshop 2007 et digressions
L’actualité des systèmes de fichiers sous Linux a été riche ces derniers mois, démarrant par la rencontre Linux Filesystem Workshop qui s’est tenue les 12 et 13 février 2007. Cet événement annuel réunit un petit nombre de développeurs noyau et est sponsorisé par des grands noms : Oracle, Network Appliance et EMC (solutions de stockage), Seagate (disques durs)... D’autre part, avec les récents débats apparus sur la LKML concernant Reiser4 et ZFS, c’est l’occasion de faire un point sur le sujet.LibAta , erreurs et matériels
Le Filesystem Workshop a été l’occasion de mener plusieurs discussions, dont une partie sur la libAta générique introduite dans le noyau 2.6.19. La partie PATA a été développée pour remettre à plat la gestion des périphériques de stockage IDE, et est en constante amélioration (débogage, ajout de matériel supporté et de fonctionnalités). Un bilan positif a été fait de la partie SATA, notamment sur ses performances et sa gestion des dernières technologies (NCQ, FUA, CompactFlash). Si la libAta utilise la couche SCSI pour la gestion et la remontée d’erreurs notamment, il a été évoqué de les rendre indépendantes, la gestion des erreurs de la libAta étant maintenant jugée plutôt bonne. Le débat a été ouvert sur la gestion d’autres catégories d’erreurs : comment le système de fichiers doit-il se comporter lorsqu’un volume SAN (volume distant connecté par fibre optique) est indisponible, qu’une clef USB est retirée de manière inattendue ou qu’un disque d’un groupe en RAID5 lâche ? La manière de gérer et d’exploiter au mieux les nouveaux disques dits "hybrides" ou "HHDD" a été abordée. Ces matériels embarquent une mémoire de type Flash (non volatile) en plus du disque dur proprement dit, ce qui peut permettre de réaliser des économies d’énergie ou d’augmenter les performances. Plusieurs possibilités s’offrent : placer toutes les métadonnées du FS dans ce cache, l’utiliser pour effectuer les écritures pour éviter d’utiliser trop souvent le disque qui est gourmand en énergie, y stocker le journal d’un FS... La question de savoir quel sous-système du noyau doit assurer le pilotage de ces caches a été posée. Actuellement, seul Windows Vista sait utiliser ces matériels.Limitations en volumétrie et ext4
Débattue lors de la précédente édition du LSF, la problématique de la taille maximale de volumes supportée par les systèmes de fichiers a amené à la création de la quatrième version d’Extended Filesystem, soit ext4 (cf. Kernel Corner 86). Pour rappel, le numéro d’un bloc est stocké dans un entier 32 bits (31 utilisés en pratique) sous ext3, et la couche d’abstraction générique aux systèmes de fichiers de Linux, VFS, stocke les numéros d’inode également sous 32 bits. En pratique, ces choix limitent la taille d’une partition à 8 To. Passer à un stockage des numéros de bloc sur plus de 32 bits aurait amené des changements trop profonds dans ext3. Un consensus entre développeurs a donc abouti à la décision d’ouvrir une nouvelle branche d’ext, nommée ext4dev pour l’instant. Les numéros de blocs sont stockés sur 48 bits, repoussant la limite théorique de taille à 1024 PB. La création d’un système de fichiers distinct d’ext3 est également l’occasion d’ajouter des fonctionnalités et d’améliorer les performances. Si les caractéristiques définitives de ce qui deviendra ext4 ne sont pas encore figées, on sait d’ores et déjà que ce ne sera pas une révolution, mais une évolution en douceur. On notera tout de même en particulier les fonctionnalités/technologies suivantes (qui seront incluses ou très probablement incluses) :- L’apparition d’une structure appelée "extent", décrivant l’emplacement des données physiques sur le disque. C’est une structure beaucoup plus efficace pour désigner les blocs contenant les données de moyens et gros fichiers. Rappel : actuellement sous ext2/3, si un fichier dépasse la taille de 48 Ko, l’emplacement de ses blocs de données sur le disque sera décrit via un pointeur de l’inode renvoyant sur un bloc intermédiaire, contenant lui-même les adresses des prochains blocs hébergeant les données dudit fichier ; si on dépasse 4 Mo, l’inode contiendra un pointeur vers un autre bloc de pointeurs de bloc, chacun d’entre eux décrivant des blocs de données... On imagine le coût de cette structure pour l’accès aux gros fichiers. L’option
extentsera désactivable, ce qui permettra de monter une partition ext3 en ext4 ; une fois activée, cette rétro-compatibilité sera perdue. - Le support de plus de 32000 sous-éléments par répertoire.
- De nouveaux modes d’allocation des blocs de données devraient faire leur apparition. Typiquement, quand une application souhaite créer et écrire dans un fichier, le noyau se charge aussitôt de réserver un bloc sur le disque à cet effet. Cette méthode peut ne pas être la plus optimale : si l’application doit écrire un certain volume de données, le noyau doit, au fur et à mesure qu’il reçoit des données à écrire, réserver d’autres blocs. N’ayant pas pu anticiper suffisamment la quantité de données à écrire, il peut avoir choisi de réserver les blocs à un emplacement n’ayant pas assez de blocs contigus libres ; il est alors obligé d’en choisir ailleurs pour continuer la sauvegarde du fichier, mais celui-ci sera alors fragmenté, entraînant les problèmes de performance que nous connaissons bien. Autre cas fréquent : les applications peuvent avoir besoin de créer des fichiers à durée de vie très brève ; actuellement une réservation systématique de blocs est effectuée. La technique d’allocation tardive (delayed allocation) peut effectuer la réservation de plusieurs blocs à la fois, ce qui offre deux avantages : cette opération est effectuée moins fréquemment et réserve d’un coup le plus de blocs contigus possible, étant donné qu’on a cette fois une meilleure idée de la quantité d’informations à écrire ; en conséquence, on réduit du même coup la fragmentation de fichier. Dans le cas d’un fichier temporaire, il peut n’avoir pas été nécessaire du tout d’effectuer l’opération s’il a été créé et supprimé en très peu de temps. Techniquement, l’allocation des blocs serait effectuée lors de l’appel
writeback()plutôt qu’à chaqueprepare_write(). Un consensus reste à trouver pour savoir si ceci doit être implémenté au niveau FS (ici donc ext4) ou généralisé à VFS. L’allocation persistante (persistent allocation) est une technique permettant de réserver à l’avance un espace défini de blocs contigus pour un fichier ; ceci permet d’éviter la fragmentation, et de garantir dès le départ que l’écriture pourra être réalisée (espace suffisant). Elle devrait être implémentée et utiliser des extents non initialisés à l’avance : ils seraient créés et marqués d’un statut spécial, ce qui diffère des solutions déjà existantes qui pré-remplissent les blocs de zéros (coûteux). À noter que l’allocation persistante a une fonctionposix_fallocate()définie par la norme POSIX, mais non implémentée sous Linux ; des discussions pour l’ajouter sont en cours suite à un patch d’Amit Arora (IBM). - Certainement, le support de dates de création/modification/accès dites "à haute résolution" (nanoseconde), afin de pallier les problèmes pouvant se poser par exemple sur des fichiers auxquels plusieurs applis sont susceptibles d’accéder à de très courts intervalles de temps.
- En cours de développement : défragmentation en ligne (sur système de fichiers monté).
Vérification d’un FS et ChunkFS
Point déjà soulevé lors du LSF workshop 2006 et dans votre Kernel Corner 86, le problème du temps de vérification d’un système de fichiers, qui croît à mesure que les capacités de stockage augmentent, est revenu dans le débat : le temps d’exécution d’unDébats autour de Reiser4 et ZFS
Le statut de Reiser4, resté au point mort depuis quelques mois, refait surface sur la LKML. Plusieurs partisans de ce FS ont réclamé son inclusion dans le noyau. Andrew Morton y a apporté une réponse plutôt favorable ; jusqu’à maintenant, l’audit du code incomplet et la situation judiciaire de son auteur, Hans Reiser, avaient bloqué toute avancée. Cependant, deux développeurs de Namesys, la société de Reiser, se sont déclarés prêts à assurer la maintenance du code sur leur temps libre. Ils ont déclaré vouloir corriger quelques bugs et travailler encore sur quelques modifications (support des attributs étendus, taille de bloc non fixée à 4 k) avant de demander à nouveau officiellement une inclusion dans la branche officielle de Linux. Au final, le cas de Resier4 a également reçu le soutien du développeur Andi Kleen (développeur noyau chez Suse/Novell). Le cas de ZFS est également régulièrement évoqué sur cette même LKML. Disposant d’atouts indéniables (copy-on-write, contrôle logiciel de la validité des données écrites...) et d’une grande simplicité d’administration, ce système de fichiers pose cependant deux problèmes majeurs à la communauté Linux : son organisation fait qu’il est à la fois un gestionnaire de redondance (RAID), un système de fichiers physique (format sur disque), un gestionnaire de volumes. Il n’est pas possible de l’inclure dans Linux sans violer l’organisation actuelle de la partie FS : les systèmes de fichiers physiques d’un côté, la gestion du RAID logiciel indépendante d’un autre et, enfin, la gestion de volumes générique (LVM). Le fait que ZFS empiète sur ces 3 domaines à la fois est vu comme une erreur de design par les développeurs noyau Linux. Enfin, la licence et les brevets déposés par Sun sur ce FS rebutent le monde Linux : la CDDL est incompatible avec la GPL et, si Sun a placé des parties de ZFS sous GPLv2, il s’agit principalement du code minimal permettant de lire une partition ZFS (afin que le gestionnaire de boot GRUB soit compatible avec OpenSolaris, d’après Theodore Tso). Il semble donc peu probable que ZFS soit utilisable sous Linux autrement que via FUSE, ce qui pénalise les performances. Le monde des systèmes de fichiers est donc bouillonnant d’idées en cette période. Cependant, on peut remarquer que tous ces concepts et caractéristiques novateurs sont éparpillés parmi les FS, et qu’aucun n’en propose vraiment un ensemble complet. Pour tenter d’y voir clair, tentons de synthétiser les caractéristiques principales faisant le fort de quelques-uns d’entre eux, ainsi que leurs points faibles, dans le tableau ci-après. Nous ne présentons que les systèmes de fichiers dits "génériques" et décrits précédemment. Étant donné sa popularité et les débats qu’il soulève sur la LKML, ZFS figure à titre de comparaison. 





Donnez votre avis
Vous devez avoir ouvert une session pour écrire un commentaire.