Disques : performance

Disques : performance jpp

La performance des disques.

Le premier article présente un moyen d'atteindre des débits disques plus importants : le "stripping".

Ces articles étalés sur une période supérieure à 10 ans montrent bien l'augmentation des performances de ces belles petites mécaniques (ou électroniques pour les SSD).

SSD, avec Linux c'est super

SSD, avec Linux c'est super jpp

SSD : depuis que l'on en parle j'avais envie de tester ce genre de bête. 
J'ai craqué et cassé ma tire-lire pour pouvoir disposer d'un de ces trucs : "OCZ Vertex Turbo series" de 30Go avec un cache de 64Mo. 
Par ailleurs mon système XEN étant le résultat de nombreuses migrations :

  • Suse SLES 10
  • Suse SLES 10 SP1
  • Suse SLES 10 SP2
  • Suse SLES 11
  • OpenSuse  11.1

Son disque système devait commencer à être assez bizarre, j'ai décidé de "repartir à zéro" et d'utiliser mon nouveau disque comme disque système. 
Tout ça c'était avant mon retour à Debian, pensez ma première machine Linux était une Debian avec un kernel 1.0.1. 
J'ai sauvegardé sur un disque externe tout ce qui avait de la valeur (par exemple le répertoire "/etc" et d'autres bricoles). 
Je démonte les disques de stockage de données par sécurité (2 x 1To en miroir car toutes mes Machines virtuelles sont dessus) , je les remettrai en service plus tard, on n'est jamais trop prudent ! Ne doutant de rien j'ai tenté d'installer une OpenSuse 11.2 en rc1 voir site  http://www.opensuse.org . Après quelques ennuis de gravure (ISO mal récupérée ?), c'est bizarre comme cela énerve, j'ai enfin réussi à créer le CD miracle. Malheur, lors de l'installation de cette 11.2 il y a un problème de génération du fichier "initrd" et des erreurs diverses qui rendaient le système inutilisable. Je suis repassé sur une OpenSuse 11.1 (stable) dont j'avais le DVD et ... l'installation a foiré sur mon beau SSD tout neuf ... Après quelque réflexion, j'ai lu des bricoles sur les problèmes d'installation de systèmes sur des SSD, j'ai décidé de frapper un grand coup : j'ai réduit (sniff) fortement la vitesse du CPU (multiplicateur passé de 11x à 7x), en bref j'ai transformé ma belle machine en brouette ... et celà a fonctionné ! L'installation de la 11.1 s'est fort bien passée. J'ai admiré au passage la beauté de l'installeur OpenSuse dont les graphismes sont parfaits, toutes les options de formatage des partitions sont assez bien foutues (si l'on met l'écran à 1024x768 au moins ...) et tout se passe bien. J'ai abandonné la partition spécifique "BOOT" et tout mis dans une seule partition du SSD. Après le paramétrage de l'installation tout est automatique et s'est déroulé en à peu pres 30 minutes (malgré le 7x). Note : il vaut mieux "nommer" les partitions pour être dans la course, ma partition root se voit donc nommée "ROOT" (très original). Une seule partition sur l'ensemble du SSD (29,8 GO) nommée "ROOT" et montée par label. Après un arrêt pour remettre le multiplicateur à 11x le boot est super rapide, le chargement des logiciels presque instantané, OpenOffice apparait très rapidement sur l'écran, en bref c'est super agréable. Vive le SSD ! Comme je disposais toujours de mon DVD 11.2 et que j'avais un peu de temps j'ai décidé de refaire une installation de 11.2 avec le multiplicateur réduit à 7x, on efface tout et on recommence. 
C'est parti :

  • on redéfinit les partitions (idem à celle définies précedemment),
  • on choisit les logiciels à installer (on utilise le bureau KDE car "gdm" ne fonctionne pas avec le kernel XEN.
  • on crée les utilisateurs "de base" en faisant attention à ne pas leur configurer un login automatique, c'est ennuyeux par la suite

"Suivant" l'installation démarre ... après environ 15 minutes la machine reboote pour la phase de configuraton. Aucune erreur ... bizarre le système gère mal l'installation sur SSD lorsque l'on est à pleine vitesse ???? La phase de configuration automatique se lance et ne signale aucun problème. 5 minutes après je dispose d'un beau bureau Gnome avec couleurs personnalisées par Suse,  avec un logo Suse stylisé en fond, très smart en vert olive et noir. Je vais voir un peu ce que cela donne après un reboot er remise en place du multiplicateur à 11X. Beagle est en train d'indexer je le laisse finir avant de rebooter. Une petite image de l'écran Gnome : Ecran GNOME SUSE 11.2

C'est beau ! 
On configure le réseau, tiens la configuration est construite directement avec des ponts, il n'y aura peut-être pas d'ennuis avec les machines virtuelles. 
Enfin on va rebooter et passer en vitesse normale, fini le ralenti. 
Après reboot le système répond très bien, c'est super... 
Essayons Xen maintenant, on reboote sur le noyau XEN et horreur l'écran graphique est tout bizarre, ce doit être une oeuvre abstraite. Mais, sans rigoler, l'accès est impossible en mode graphique et bloque le clavier si l'on a le malheur de cliquer. 
La machine reste toutefois accessible par ssh ... essayons de lancer une MV par ssh, "xm new MV" puis "xm start MV", tiens cela a l'air de marcher ... la machine virtuelle est accessible de l'extérieur, une petite connexion en X permet un accès graphique normal à la MV, tout est donc normal à part cet écran graphique bloqué ! 
Je tente alors de passer par kdm au lieu de gdm, plus de GNOME mais du KDE. 
En mode non-XEN tout est OK, le fonctionnement est parfait l'écran KDE est lui aussi très esthétique. 
En mode XEN ... ce n'est pas mieux qu'avec GNOME l'écran graphique reste dans un état "bizarre" et tant que l'on a pas cliqué sur cet écran de malheur on peut commuter sur les terminaux caractère par Ctrl+Alt+Fn. 
Vite un petit rapport de bug pour tenter d'aider à résoudre ce problème :

  • Bug non encore répertorié (Release Candidate), tout est normal en 11.1, je l'ouvre
  • Rapidement un début de solution : dire à XEN de n'utiliser que 4Go, ... et ça marche, la session X s'ouvre et on peut lancer une machine virtuelle en interactif.
  • Une piste pour la solution de ce bug existe, une limite mémoire à 4Go cela me rappelle un système 32bits ! 'ai proposé de tester le patch dès qu'il sera disponible.
  • 7 Novembre : le patch est disponible ... il concerne "vmalloc.c" qui semblait ne pas bien s'entendre avec Xen. Le patch passé on recompile le noyau sous un autre nom. Après ajout des lignes "qui vont bien" dans le fichier de configuration de grub (menu.lst) on teste et c'est OK ! 
    Toute la mémoire est reconnue sous Xen, le serveur X se lance correctement, tout est pour le mieux dans le (presque) meilleur des mondes. J'espère que ce patch va être intégré dans la version définitive.

Evidemment ce n'est pas terrible de limiter à 4Go, je le vois mal sur un serveur de production (j'en connais à 64 Go) avec 2 douzaines de MV). Enfin je peux tester cette version 11.2 avec un XEN 3.4.1 dernier cri. Et cela marche assez bien. 
Pour montrer que cela marche je ne résiste pas à montrer l'écran avec la MV sur laquelle je suis en train de travailler (KDE + Windows) : 
 

Cela prouve que tout marche ! 

En bref SSD c'est OK, à part lors de l'initialisation du système où quelque chose ne "suit" pas. 
Tests de vitesse :

  • Sur un RAID (miroir) SATA : 
    hdparm -t /dev/md1 
    /dev/md1: 
    Timing buffered disk reads:  232 MB in  3.00 seconds =  77.25 MB/sec
  • Sur le SSD : 
    hdparm -t /dev/sdc1 
    /dev/sdc1: 
    Timing buffered disk reads:  508 MB in  3.00 seconds = 169.26 MB/sec

Ces différences expliquent la réduction du temps de boot, le confort ressenti au chargement d'applications. 
Temps de boot du système depuis le choix du noyau (GRUB) < 16 secondes pour l'invite de X, le système contient  4 disques de données (miroir et LVM) en plus du SSD et deux interfaces réseau ce qui rallonge le temps de boot. 

En bref : SSD c'est presque OK ! Pour terminer, économisez votre SSD en lui évitant des ordres d'écriture dont il peut se passer, utiliser les options "nodiratime" et "relatime / noatime" dans le fichier /etc/fstab, voici la ligne correspondante dans mon propre fichier fstab : 
UUID=e5a02c97-cba2-4198-9b7a-1b1d354143ba  /  ext3  relatime,nodiratime,errors=remount-ro     0       1 
cela pourrait être aussi :  
/dev/sda1         /               ext3    relatime,nodiratime,errors=remount-ro     0       1

SSD : importance du TRIM

SSD : importance du TRIM jpp

Les disques SSD c'est bien, c'est super-rapide, mais cela souffre d'un certain handicap après de nombreuses mises à jour. Le contrôleur interne du SSD essaye de répartir l'utilisation des "blocs" afin de ne pas avoir un bloc ré-écrit en permanence qui ne manquerait pas de "s'user" avant les autres. 
Le contrôleur interne du SSD a donc "besoin" de connaitre les blocs libérés afin de pouvoir les ré-attribuer. Or les systèmes de gestion de fichiers de Linux, s'ils libèrent les blocs d'un fichier détruit (et enregistrent ces blocs comme "libres) n'en informent pas le contrôleur interne du SSD, celui-ci se trouve donc, au bout d'un certain temps, "à court" de blocs qu'il sait pouvoir réattribuer. 
Cet état de fait est très préjudiciable à la performance (surtout en écriture) lorsque le disque a un peu vécu. 
Heureusement on trouve sur Sourceforge au sein du projet "hdparm" un logiciel (wiper) qui permet de transmettre au contrôleur interne du SSD les renseignements voulus (http://sourceforge.net/projects/hdparm/files/wiper-2.6.tar.gz) qui permet de réaliser l'opération. 
Le seul problème est que mon disque (OCZ Vertex) était un peu "ancien" (version firmware 1.4) et qu'il faut être au moins en 1.5). Heureusement, OCZ a publié une image ISO qui permet de réaliser cette opération délicate, on peut la trouver à (http://www.ocztechnologyforum.com/staff/ryderocz/vertex/vertex_15.zip) qu'il faut dézipper, graver en ISO. Il faut ensuite booter sur le CD avec le SSD monté, le reste est expliqué sur l'écran, attention tous les SSD Vertex (même en version 1.4) ne sont pas "capables" de recevoir cette mise à niveau (???). 
Nouveauté 1: il existe sur le site une version pour SSD "récalcitrants" (avec "fail" dans le nom, j'en avais un qui refusait la mise à jour "standard", avec cette version l'affreux SSD a parfaitement été mis à jour. 
Nouveauté 2 : il existe maintenant une version 1.6 du soft des SSD que je vais essayer à l'occasion. 

Attention, ces manipulations peuvent entraîner une perte de données !!! Un bon backup est nécessaire !!! 
Dans mon cas où il s'agissait du disque "système", j'en ai réalisé une copie conforme sur un "vieux" disque SATA (dd est un très bon ami à moi) que j'ai ensuite testé (faut que ça boote !), avant de tenter les manip : "upgrade version firmware SSD" et "wiper". 
Ces manipulations devraient disparaître peu à peu en fonction de l'évolution des noyaux, (il existe des outils intégrés pour Windows 7) et le noyau Linux devrait rapidement prendre en compte cette option. 
En attendant il est nécessaire de recourir à des manipulations assez peu orthodoxes. Si on peut "wiperiser" un disque démonté il n'est pas possible de la faire sur le disque système, le mieux est probablement de disposer d'un CD (ou clé USB) avec un système minimal et le très fameux WIPER. 
Toutefois il n'est pas besion d'exécuer cette manip tous les jours ! Sur un disque très chargé en écriture comme le mien (cela s'est calmé depuis) il a fallu plusieurs mois avant de ressentir le ralentissement en écriture, la lecture restait OK. 
J'ai refait les tests "iozone" (il faut conserver les scripts !) lors desquels j'avais trouvé des performances "horribles" en écriture sur une machine et les résultats sont là : il faut trimer pour que le disque bosse à la vitesse max. 
Note : cette machine avait servi à de nombreuses compilations (et installations) de noyaux et de différentes version de XEN, opérations qui réalisent énormément d'écritures. 

Voici deux séries d'image dans le style AVANT/APRES bien connu des publicitaires .... mais ce n'est pas du rêve, c'est bien la réalité

 

Avant Après
"Write" 

 
 Random Write 

 
Record Write 

 
 

C'est assez spectaculaire, et c'est bien, physiquement, le même disque ... vive le TRIM. 

Une séance de trim : 
1) Test sans valider, "pour voir" 
# ./wiper.sh /dev/sdb2                                                 

wiper.sh: Linux SATA SSD TRIM utility, version 2.6, by Mark Lord. 
Hdparm version 
Target=/dev/sdb2 Method=offline 
Preparing for offline TRIM of free space on /dev/sdb2 (ext3 non-mounted). 
This will be a DRY-RUN only.  Use --commit to do it for real. 
Syncing disks.. 
Simulating TRIM operations.. 
(dry-run) trimming 37690664 sectors from 8058 ranges 
Done. 
2) Un passage "en vrai" : 
./wiper.sh /dev/sdb2 --commit 

wiper.sh: Linux SATA SSD TRIM utility, version 2.6, by Mark Lord. 
Hdparm version 
Target=/dev/sdb2 Method=offline 
Preparing for offline TRIM of free space on /dev/sdb2 (ext3 non-mounted). 

This operation could silently destroy your data.  Are you sure (y/N)? y 
Syncing disks.. 
Beginning TRIM operations.. 

/dev/sdb: 
trimming 37690664 sectors from 8058 ranges 
succeeded 
Done.

Et en plus c'est très rapide, moins d'une minute. Le seul problème est que cela ne fonctionne pas sur un disque monté et un disque système non monté c'est légèrement gênant !

Mais si l'on a un autre disque bootable il n'y a aucun problème, on peut aussi démarrer sur un Live CD sur lequel on a installé le logiciel adéquat. J'ai deux disques bootables sur deux versions différentes du système dont une "stable", donc pas de problème de ce coté.

Le support du "TRIM" est partiel depuis le noyau 2.6.32 et limité aux filesystems "btrfs" (2.6.32) et "ext4" (2.6.33) en utilisant l'option "discard" dans la déclaration du périphérique dans "fstab", exemple :

/dev/sda1 / ext4 defaults,noatime,discard 0 0

Il va falloir passer le disque système en ext4, est-ce déjà judicieux ?

SSD : 2016 le TRIM

SSD : 2016 le TRIM jpp

Le "TRIM" est toujours important mais les noyaux et les" file systems" récents offrent des possibilités d'automatisation des actions de TRIM. 
Au niveau du fichier "fstab" : 
L'apparition d'une nouvelle possibilité "discard" permet d'automatiser la gestion du TRIM en la laissant au système, il faut pour cela disposer de noyaux assez récents et je ne sais plus quelle version a apporté cette nouveauté. 
Exemple de déclaration "fstab" :

LABEL=LOG1    /LOG/LOG1   ext4    auto,noatime,relatime,discard    2    0

Au niveau de LVM : 
Il est là aussi possible de spécifier une option automatisant le TRIM au niveau de LVM, ceci se fait dans le fichier "lvm.conf". 
Exemple de déclaration dans le fichier /etc/lvm/lvm.conf : 
issue_discards = 1 
Ce fichier est par ailleurs très bien commenté (au moins sur une Debian).

Après ces petites interventions, et un reboot, plus de soucis de trim sur vos beaux SSD qui garderont une performance optimale, probablement au prix d'une légère diminution de leur durée de vie.

SSD : mesures

SSD : mesures jpp

Les disques SSD sont très performants, c'est communément admis, mais qu'en est-il en réalité. Les systèmes Linux présentent plusieurs schedulers d'entrées/sorties, lequel est le plus adapté aux disques SSD ? 
Pour le savoir j'ai fait un certain nombre de mesures sur deux machines et avec plusieurs noyaux différents qui ont tous été compilés "à la maison". 
Le scheduler IO peut facilement être modifié dynamiquement disque par disque en intervenant dans le répertoire "/sys/block", dans ce répertoire on trouve un répertoire par disque physique contenant tout ce qu'il faut, entre autres un répertoire "queue" : 
ls -al /sys/block/sda/queue 
total 0 
drwxr-xr-x 3 root root    0 2010-01-27 15:00 . 
drwxr-xr-x 8 root root    0 2010-01-27 14:59 .. 
-r--r--r-- 1 root root 4096 2010-01-27 15:00 hw_sector_size 
drwxr-xr-x 2 root root    0 2010-01-27 15:10 iosched 
-rw-r--r-- 1 root root 4096 2010-01-27 15:10 iostats 
-r--r--r-- 1 root root 4096 2010-01-27 15:10 logical_block_size 
-r--r--r-- 1 root root 4096 2010-01-27 15:10 max_hw_sectors_kb 
-rw-r--r-- 1 root root 4096 2010-01-27 15:10 max_sectors_kb 
-r--r--r-- 1 root root 4096 2010-01-27 15:10 minimum_io_size 
-rw-r--r-- 1 root root 4096 2010-01-27 15:10 nomerges 
-rw-r--r-- 1 root root 4096 2010-01-27 15:10 nr_requests 
-r--r--r-- 1 root root 4096 2010-01-27 15:10 optimal_io_size 
-r--r--r-- 1 root root 4096 2010-01-27 15:10 physical_block_size 
-rw-r--r-- 1 root root 4096 2010-01-27 15:10 read_ahead_kb 
-rw-r--r-- 1 root root 4096 2010-01-27 15:00 rotational 
-rw-r--r-- 1 root root 4096 2010-01-27 15:10 rq_affinity 
-rw-r--r-- 1 root root 4096 2010-01-27 15:10 scheduler 

Le fichier "scheduler" contient la liste des schedulers (elevator) disponibles dans votre noyau : 
cat scheduler 
[noop] anticipatory cfq deadline 
Le scheduler actif est entouré de "[ ]" (brackets dans le texte). 
Note : "anticipatory" a disparu dans le noyau 2.6.33. 
Je vais tenter d'autres test plus représentatifs le la vie réelle (???) pour mieux mesurer l'influence (éventuelle ? ) du scheduler d'IO.Les tests réalisés sur plusieurs noyaux sont extrêmement longs et obligent à des "reboot" fréquents. 
Commentaires sur les résultats.

  • La dépendance des résultats au noyau est très forte (rappel : les noyaux sont compilés avec les mêmes options)
  • Dans les tests "vraie vie" la différence SSD/SATA est soit invisible soit pas dans le sens prévu (tests GZIP)
  • La dépendance par apport au scheduler d'IO est extrêmement faible et ne dépasse pas quelques pourcents.
  • En lecture pure (test hdparm) les SSD sont nettement plus performants (jusqu'au noyau 2.6.32 ?)

Quelques tests réalisés sur le noyau 2.6.32 on donné des résultats catastrophiques pour le SSD, 20% moins bien que le disque classique aux tests hdparm. 
J'ai récupéré et compilé un 2.6.33 (rc5) pour compléter les tableaux. Au niveau du test "hdparm" le résultat est très dégradé pour le SSD, par contre au niveau du test de compilation de 2.6.33 a fait des miracles. 
Les mesures obtenues avec "hdparm" étant un peu "bizarres" avec les disques SSD à partir du noyau 2.6.32 je pense qu'une modification importante des schedulers IO est en cours, c'est confirmé par la disparition du scheduler "anticipatory" dans le 2.6.33. Ces modifications rendent les résultats de "hdparm" tellement bizarres (anormaux et irréguliers pour les SSD) que ces résultats sont à prendre avec des pincettes. 
Dernières nouvelles les tests "hdparm" sont en cours de réfection avec un paramètre supplémentaire permettant un accès plus "direct" au hardware ( option --direct). Une nouvelle page est en préparation. 
 

SSD : mesures hdparm V0

SSD : mesures hdparm V0 jpp

Les tests ont été refaits avec de nouveaux noyaux. 
La première série de tests a été réalisée avec l'utilitaire "hdparm" dont l'option "-t" permet de mesurer un débit IO en lecture. 
Pour les machines que j'ai utilisées il s'agit des disques sda,sdb,sdc,sdd. L'une de ces machines est munie de disques en miroir, il a donc été nécessaire d'agir sur deux disques simultanément pour changer de scheduler. 
Premier test. 
Les résultats sont les suivants (valeurs en MO/seconde, le plus fort est le mieux !) : 

 

RAM 8GO     Quadcore kernel 2.6.30-2  
hdparm   hdparm hdparm hdparm TOTAL    
SSD RAID Noop 115,51 107,73 104,52 327,76 33,564% X
  CFQ 100,90 107,83 114,66 323,39 33,117%  
  Deadline 119,11 100,42 105,84 325,37 33,319%  
    335,52 315,98 325,02 976,52    
               
SATA RAID Noop 75,59 75,29 75,11 225,99 33,481% X
  CFQ 75,25 73,39 75,66 224,30 33,231%  
  Deadline 76,06 75,11 73,52 224,69 33,288%  
    226,90 223,79 224,29 674,98 SATA/SSD 69,12%
               
RAM 8GO     Dualcore kernel 2.6.31  
hdparm   hdparm hdparm hdparm TOTAL    
SSD Noop 133,35 132,61 131,89 397,85 33,241%  
  CFQ 131,36 132,33 134,13 397,82 33,238%  
  Deadline 133,63 133,96 133,61 401,20 33,521% X
    398,34 398,90 399,63 1196,87    
               
SATA RAID Noop 68,91 69,31 69,29 207,51 32,097%  
  CFQ 73,13 73,26 73,15 219,54 33,958% X
  Deadline 73,12 73,03 73,31 219,46 33,945%  
    215,16 215,60 215,75 646,51 SATA/SSD 54,02%
               
RAM 8GO     Quadcore kernel 2.6.32  
hdparm   hdparm hdparm hdparm TOTAL    
SSD RAID Noop 77,18 61,33 71,93 210,44 27,693%  
  CFQ 79,72 102,37 98,66 280,75 36,946% X
  Deadline 75,83 92,08 100,79 268,70 35,360%  
    232,73 255,78 271,38 759,89    
               
SATA RAID Noop 75,25 74,33 73,52 223,10 33,258%  
  CFQ 73,47 75,73 75,64 224,84 33,517% X
  Deadline 75,77 73,64 73,47 222,88 33,225%  
    224,49 223,70 222,63 670,82 SATA/SSD 88,28%
               
RAM 8GO     Quadcore kernel 2.6.33-rc5  
hdparm   hdparm hdparm hdparm TOTAL    
SSD RAID Noop 71,98 75,83 92,32 240,13 36,264%  
  CFQ 60,95 60,86 59,73 181,54 27,416%  
  Deadline 89,27 76,18 75,06 240,51 36,321% X
    222,20 212,87 227,11 662,18    
               
SATA RAID Noop 73,52 74,34 75,82 223,68 33,373%  
  CFQ 76,77 73,98 73,80 224,55 33,502% X
  Deadline 73,43 75,21 73,38 222,02 33,125%  
    223,72 223,53 223,00 670,25 SATA/SSD 101,22%

 

Constatation 1 : 
Les résultats sont très serrés, les différences sont peu marquantes et ne font en général que quelques pourcents. 
Constatation 2 : 
Les résultats sont différents sur la même machine avec des noyaux différents. 
Constatation 3 : 
Les résultats SSD sont meilleurs sur le Dualcore ... c'est normal, il ne s'agit pas du même SSD mais  d'un modèle vendu comme plus performant (et cela a l'air vrai) ... mais malheureusement nettement plus cher. 
Les résultats obtenus avec un noyau  > 2.6.32 sont un peu bizarres, à partir du 2.6.33 un des schedulers a disparu, je n'ai pas trouvé trace du "anticipatory scheduler", il ne reste que NOOP, CFQ et DEADLINE, les résultats sont comme pour le 2.6.32 très bizarres sur la partie SSD et se tiennent bien sur la partie SATA. J'ai oté toutes référence au scheduler "anticipatory" pour avoir des tableaux comparables sur toutes les versions. 

Le SSD présente des anomalies importantes de vitesse sur les noyaux récents :

  • Noyau 2.6.32 
    • Mini de 61,33
    • Maxi de 102,37 soit un écart de plus de 60% !
    • Alors que la partie SATA présente un écart inférieur à 3%.
  • Noyau 2.6.33
    • Mini de 59,73
    • Maxi de 92,32 soit un écart de près de 60%
    • Alors que la partie SATA présente un écart inférieur à 5%.

Les tests "hdparm" semblent complètement dépassés pour les dernières versions du noyau. Les indications relatives de ce test ne sont valables que pour les noyaux < 2.6.32. D'autre part les améliorations apportées par les noyaux >= 2.6.32 sont bel et bien ressenties à l'utilisation, voir les tests de compilation. 
Voir aussi la page sur les nouveaux tests "hdparm" éxécutés avec l'option " --direct" permettant d'utiliser plus directement le hardware. 
 

SSD : mesures hdparm V1

SSD : mesures hdparm V1 jpp

La première version des tests présentait des anomalies de performance et une grande irrégularité. J'ai "découvert" une option complémentaire de cet utilitaire ( --direct ) permettant d'atteindre plus directement le hardware en évitant le passage par les buffers système. Ce type d'option (utilisant le flag "O_DIRECT" du noyau) est d'ailleurs recommandé pour les bases de données afin d'éviter de multiples recopies en mémoire sources de perte de performance.

  • Sans "O_DIRECT" les données effectuent le transit suivant : HARDWARE --> page cache --> programme utilisateur.
  • Avec "O_DIRECT" le transit est plus direct : HARDWARE --> programme utilisateur


Cela se voit d'ailleurs dans les résultats qui représentent ainsi mieux les performances "brutes" du hardware (les valeurs indiquées sont en MO/seconde). 
Dualcore (SSD rapide) : 

RAM 8GO     Dualcore kernel 2.6.31        
hdparm -t   1 2 3 TOTAL    
SSD RAID Noop 201,87 207,80 203,05 204,24 103,873% X
  CFQ 154,12 202,68 204,47 187,09 95,151%  
  Deadline 189,17 203,52 202,94 198,54 100,976%  
    181,72 204,67 203,49 196,62    
               
SATA RAID Noop 73,50 69,23 73,48 72,07 100,721% X
  CFQ 69,26 73,22 69,58 70,69 98,787%  
  Deadline 73,20 69,32 73,20 71,91 100,492%  
    71,99 70,59 72,09 71,55 SSD/SATA 274,79%
               
RAM 8GO     Dualcore kernel 2.6.33        
hdparm -t   1 2 3 TOTAL    
SSD RAID Noop 201,06 202,40 201,43 201,63 101,058% X
  CFQ 198,19 197,41 199,59 198,40 99,437%  
  Deadline 198,50 198,60 198,50 198,53 99,505%  
    199,25 199,47 199,84 199,52    
               
SATA RAID Noop 68,99 69,07 69,12 69,06 99,722%  
  CFQ 69,06 69,54 69,31 69,30 100,074%  
  Deadline 69,72 69,23 69,23 69,39 100,204% X
    69,26 69,28 69,22 69,25 SSD/SATA 288,11%

Quadcore (SSD "lent") : 

RAM 8GO     Quadcore kernel 2.6.31        
hdparm -t   1 2 3 TOTAL    
SSD RAID Noop 144,79 144,42 101,67 130,29 105,715% X
  CFQ 125,20 144,35 101,65 123,73 100,392%  
  Deadline 144,39 101,12 101,66 115,72 93,893%  
    138,13 129,96 101,66 123,25    
               
SATA RAID Noop 75,62 73,62 76,04 75,09 100,341%  
  CFQ 73,41 75,83 73,54 74,26 99,228%  
  Deadline 75,83 73,58 76,07 75,16 100,431% X
    74,95 74,34 75,22 74,84 SSD/SATA 164,69%
               
RAM 8GO     Quadcore kernel 2.6.33        
hdparm -t   1 2 3 TOTAL    
SSD RAID Noop 137,88 137,87 137,87 137,87 103,297% X
  CFQ 137,85 137,84 137,86 137,85 103,280%  
  Deadline 137,82 137,87 98,39 124,69 93,423%  
    137,85 137,86 124,71 133,47    
               
SATA RAID Noop 75,78 75,85 75,87 75,83 100,066% X
  CFQ 75,71 75,69 75,81 75,74 99,938%  
  Deadline 75,78 75,71 75,85 75,78 99,996%  
    75,76 75,75 75,69 75,78 SSD/SATA 176,12%

Les résultats sont un peu irréguliers pour le SSD ce qui "baisse" la moyenne à 123MO/seconde en 2.6.31 et 133MO/seconde pour le noyau 2.6.33. 
Autre machine (ATOM N330) : 
J'ai fait faire les tests sur un nouveau "petit" serveur (ATOM N330) avec lequel on obtient les résultats suivants : 

RAM 2GO     MINIITX kernel 2.6.33        
hdparm -t   1 2 3 TOTAL    
SSD RAID Noop 148,34 152,50 149,89 150,24 100,647% X
  CFQ 149,63 154,00 143,41 149,01 99,823%  
  Deadline 144,02 148,59 153,12 148,58 99,530%  
    147,33 151,70 148,81 149,28    
               
SATA RAID Noop 73,59 73,52 73,33 73,48 100,041% X
  CFQ 73,52 73,56 73,35 73,48 100,036%  
  Deadline 73,30 73,45 73,43 73,39 99,923%  
    73,47 73,51 73,37 73,45 SSD/SATA 203,24%

Ce qui n'est pas mal du tout pour une petite machine. 
Il a juste fallu ajouter un disque SATA de 160Go (8Mo cache) dans la belle boîte pour faire ces tests.

SSD : mesures gzip

SSD : mesures gzip jpp

Deuxième test. 
Devant ces résultats un peu théoriques j'ai essayé de faire d'autres mesures peut-être plus représentatives. J'ai donc mesuré le temps de "dézipper" et de "rezipper" les sources du noyau "linux-2.6.31.6.tar.gz" soit à peu près 79Mo zippés et # 380Mo dézippés. 
Les commandes exécutées sont : 
sync 
cd $REP 
gzip -d linux-2.6.31.6.tar.gz 
sync 
gzip linux-2.6.31.6.tar 
sync 

Et la durée "ellapsed" de l'ensemble est mesurée par la commande "time" dont le résultat "real" est repris dans les tableaux. 
Trois séries de tests ont été exécutées pour chacun des schedulers disponibles.  

RAM 8GO     Quadcore kernel 2.6.30.2    
Gzip   Gzip Gzip Gzip TOTAL      
SSD RAID Noop 38,20 35,14 36,03 109,37 24,726% X 24,726%
  CFQ 38,06 37,20 36,50 111,76 25,267%    
  Anticip 36,84 36,20 37,17 110,21 24,916%    
  Deadline 38,89 36,07 36,02 110,98 25,091%    
    151,99 144,61 145,72 442,32      
                 
SATA RAID Noop 25,88 26,08 26,14 78,10 25,006%   24,853%
  CFQ 26,21 26,11 26,25 78,57 25,157%    
  Anticip 25,90 25,95 26,18 78,03 24,984%    
  Deadline 25,48 26,03 26,11 77,62 24,853% X  
    103,47 104,17 104,68 312,32      
                 
RAM 3GO     Quadcore kernel 2.6.31.4-xen (XEN)    
Gzip   Gzip Gzip Gzip TOTAL      
SSD RAID Noop 69,62 67,71 69,00 206,33 25,056%   24,801%
  CFQ 69,13 68,31 66,79 204,23 24,801% X  
  Anticip 69,78 67,77 69,32 206,87 25,122%    
  Deadline 68,94 68,85 68,25 206,04 25,021%    
    277,47 272,64 273,36 823,47      
                 
SATA RAID Noop 58,96 58,30 58,65 175,91 24,999% X 24,999%
  CFQ 58,43 58,91 58,58 175,92 25,000%    
  Anticip 58,67 58,53 58,71 175,91 24,999% X  
  Deadline 58,30 59,51 58,12 175,93 25,002%    
    234,36 235,25 234,06 703,67      
                 
RAM 8GO     Quadcore kernel 2.6.31.4-xen (XEN)    
Gzip   Gzip Gzip Gzip TOTAL      
SSD RAID Noop 73,08 74,02 71,39 218,49 24,943%   24,904%
  CFQ 74,30 72,18 73,82 220,30 25,150%    
  Anticip 72,62 72,90 73,50 219,02 25,003%    
  Deadline 73,35 73,03 71,77 218,15 24,904% X  
    293,35 292,13 290,48 875,96      
                 
SATA RAID Noop 62,21 62,09 62,24 186,54 24,985% X 24,985%
  CFQ 62,08 61,62 63,18 186,88 25,030%    
  Anticip 62,09 61,70 62,85 186,64 24,998%    
  Deadline 63,08 61,90 61,57 186,55 24,986%    
    249,46 247,31 249,84 746,61      


Les résultats montrent que les SSD ne gagnent pas toujours ! Curieusement tous les tests sur le disque SSD sont très nettement moins bons, presque deux fois moins rapides !

Une analyse plus fine montre que les temps de dézippage sont quasiment identiques (# 3 secondes) mais les temps de zippage sont très différents, 30 secondes pour le SSD et 15 secondes pour le disque SATA. Les quelques seconds "manquantes" sont le fait des ordres "sync" destinés à forcer les écritures.

Je n'ai encore trouvé aucune explication à ce phénomène, mais visiblement ce test pose un problème aux disques SSD.

On remarque dans ces tableaux que deux noyaux assez proches (2.6.30 et 2.6.31) ont des temps de réponse très différents :

2.6.30 : durée totale des tests (8Go RAM) : 442 + 312 = 754

2.6.31 : durée totale des tests  (3Go RAM) : 823 + 703 = 1526 soit grossièrement le double des temps du 2.6.30 !

2.6.31 : durée totale des tests (8Go RAM) : contre toute attente la durée totale est de plus de 1620 secondes soit 6% de plus qu'avec 3Go.

Je constate sans expliquer .....

SSD : mesures compilation

SSD : mesures compilation jpp

Devant les différents points d'interrogation posés par les tests précédents j'ai décidé de faire d'autres tests encore plus près de "la vie réelle" en réalisant un petit exercice de compilation. 
J'ai pris comme "cobaye" le logiciel IPERF dans sa version 2.0.4 et réalisé les opérations suivantes :

  • Création d'un répertoire de compilation sur le SSD /var/tmp/iperf-2.0.4
  • Création d'un répertoire de compilation sur le disque SATA /RAIDZZZ/tempo/iperf-2.0.4

Chacun de ces répertoires comporte bien entendu l'arbre des sources de IPERF et une compilation a été réalisée "à la main". Les opérations réalisées par le script (mesurées par la commande "time" ) seront : 
sync 
cd $REP 
make clean 
rm -f config.status 
./configure 
make -j 2 
sync 
Les temps "real" figurent dans le tableau suivant ( valeurs en secondes, le plus faible est le mieux) :

RAM 8GO     Dualcore kernel 2.6.31    
Compil   Compil Compil Compil TOTAL      
SSD RAID Noop 14,98 15,30 15,08 45,36 33,324%   33,257%
  CFQ 15,02 15,17 15,08 45,27 33,257% X  
  Deadline 15,17 15,19 15,13 45,49 33,419%    
    45,17 45,66 45,29 136,12      
                 
SATA RAID Noop 15,86 15,91 15,85 47,62 33,649%   33,154%
  CFQ 15,83 15,82 15,27 46,92 33,154% X  
  Deadline 15,93 15,33 15,72 46,98 33,197%    
    47,62 47,06 46,84 141,52 SATA/SSD 103,97%  
                 
RAM 3GO     Quadcore kernel 2.6.31-4-xen    
Compil   Compil Compil Compil TOTAL      
SSD RAID Noop 28,80 27,86 27,71 84,37 33,190%   33,068%
  CFQ 27,89 28,30 27,87 84,06 33,068% X  
  Deadline 28,18 28,32 29,27 85,77 33,741%    
    84,87 84,48 84,85 254,20      
                 
SATA RAID Noop 28,83 28,17 27,93 84,93 33,377%   33,149%
  CFQ 28,27 28,52 28,39 85,18 33,475%    
  Deadline 27,97 27,82 28,56 84,35 33,149% X  
    85,07 84,51 84,88 254,46 SATA/SSD 100,10%  
                 
RAM 3GO     Dualcore kernel 2.6.31-8-xen    
Compil   Compil Compil Compil TOTAL      
SSD RAID Noop 14,34 15,20 15,19 44,73 33,116% X 33,116%
  CFQ 15,11 15,13 15,23 45,47 33,664%    
  Deadline 14,84 15,11 14,92 44,87 33,220%    
    44,29 45,44 45,34 135,07      
                 
SATA RAID Noop 16,59 15,83 16,65 49,07 34,152%   32,719%
  CFQ 15,87 15,44 15,70 47,01 32,719% X  
  Deadline 15,85 15,90 15,85 47,60 33,129%    
    48,31 47,17 48,20 143,68 SATA/SSD 106,37%  
                 
RAM 8GO     Quadcore kernel 2.6.30-2    
Compil   Compil Compil Compil TOTAL      
SSD RAID Noop 14,48 14,39 14,28 43,15 33,538%   33,103%
  CFQ 14,24 14,07 14,28 42,59 33,103% X  
  Deadline 14,26 14,45 14,21 42,92 33,359%    
    42,98 42,91 42,77 128,66      
                 
SATA RAID Noop 14,70 15,46 15,08 45,24 34,066%   32,937%
  CFQ 14,28 14,11 15,43 43,82 32,997%    
  Deadline 14,35 14,79 14,60 43,74 32,937% X  
    43,33 44,36 45,11 132,80 SATA/SSD 103,22%  
                 
RAM 8GO     Quadcore kernel 2.6.32    
Compil   Compil Compil Compil TOTAL      
SSD RAID Noop 11,09 10,38 10,24 31,71 34,031%   32,958%
  CFQ 10,19 10,33 10,19 30,71 32,958% X  
  Deadline 10,33 10,26 10,17 30,76 33,011%    
    31,61 30,97 30,60 93,18      
                 
SATA RAID Noop 11,69 10,88 10,95 33,52 33,924%   32,952%
  CFQ 10,81 10,87 10,88 32,56 32,952% X  
  Deadline 10,97 10,90 10,86 32,73 33,124%    
    33,47 32,65 32,69 98,81 SATA/SSD 106,04%  
                 
RAM 8GO     Quadcore kernel 2.6.33-rc5    
Compil   Compil Compil Compil TOTAL      
SSD RAID Noop 10,17 10,16 10,21 30,54 33,217% X 33,217%
  CFQ 10,22 10,30 10,29 30,81 33,511%    
  Deadline 10,17 10,17 10,25 30,59 33,272%    
    30,56 30,63 30,75 91,94      
                 
SATA RAID Noop 10,22 10,28 10,30 30,80 33,315% X 33,315%
  CFQ 10,25 10,30 10,30 30,85 33,369%    
  Deadline 10,22 10,28 10,30 30,80 33,315% X  
    30,69 30,86 30,90 92,45 SATA/SSD 100,55%  
                 
RAM 8GO     Dualcore kernel 2.6.33-rc6    
Compil   Compil Compil Compil TOTAL      
SSD RAID Noop 12,62 12,19 12,06 36,87 33,601%   32,963%
  CFQ 12,00 12,19 11,98 36,17 32,963% X  
  Deadline 12,02 12,21 12,46 36,69 33,437%    
    36,64 36,59 36,50 109,73      
                 
SATA RAID Noop 13,73 13,08 12,37 39,18 33,313%   32,829%
  CFQ 13,11 13,61 13,10 39,82 33,858%    
  Deadline 12,74 12,81 13,06 38,61 32,829% X  
    39,58 39,50 38,53 117,61 SATA/SSD 107,18%  


Par ailleurs les différences entre les différents scheduler d'IO ne sont pas significatives sur ces tests car elles restent inférieures à 1%.Les temps sont meilleurs pour les deux types de disques dans les montées de version du noyau Linux. 
Le temps total (9 exécutions) passe de #92 secondes pour le noyau 2.6.33 à #95 pour le 2.6.32 à #130 secondes pour le 2.6.30. Visiblement les développeurs du noyau ont bien travaillé et les progrès sont nettement visibles. 
Cette série de tests montre un léger avantage au SSD par apport au disque "classique" une différence de 4 à 6% se manifeste en sa faveur.

SSD : mesures IOZONE

SSD : mesures IOZONE jpp

La construction des tests progresse, les groupes de valeurs ont été choisis :

  • Taille des fichiers testés : 4, 8, 16, 32, 64, 128, 256, 512 et 1024 MégaOctets
  • Taille des enregistrements : 16, 32, 64, 128, 256 et 512 octets

 Cela devrait donner des chiffres significatifs. Pour pouvoir effectuer ces tests pour plusieurs noyaux sur SSD et SATA classique un petit ensemble de scripts a été réalisé et pour présenter de jolis graphiques je me suis replongé dans "GNUPLOT" et après quelques scripts de traitement des données il me sera possible de présenter de jolis dessins. 
Par contre l'acquisition des tests est très longue et se chiffre en heures pour un seul passage complet de tests. 
Devant le peu de différences entre les différents schedulers les tests ne seront faits que pour le scheduler "noop", a priori le moins compliqué, qui devrait mieux représenter la performance "brute" des disques. 
Les petits dessins et quelques commentaires sous peu ... dès que l'ensemble des tests aura "tourné" et que quelques commentaires seront disponibles ... 
La commande utilisée ( ici fichier de 1024Mo, enregistrements de 32 caractères sur un disque SATA ) : 

iozone -s 1048576 -r 32 -f /tempo/testio -I -o -M

  • -s Taille du fichier en KO
  • -r taille de l'enregistrement en cacartères
  • -f fichier de travail (sur disque SATA ou SSD)
  • -I  Use VxFS VX_DIRECT, O_DIRECT,or O_DIRECTIO for all file operation
  • -o  Writes are synch (O_SYNC)
  • -M Report uname -a output

8

Les tests sont réalisés sur deux machines possédant chacune des disques SSD et des SATA classiques :

  • Amd dualcore 4400+ à 2.20 Ghz, 8 Go RAM, contrôleur SATA nvidia CK804, avec un SSD très rapide et deux disques SATA 1To en RAID1 (miroir).
  • Amd quadcore 905e à 2,5Ghz, 8Go Ram, contrôleur ATI SB700/SB800, avec un SSD plus standard et deux disques SATA assez anciens de 160Go en RAID1 (miroir).

Cà y est enfin, j'ai toutes les données nécessaires, le processus est très long ... deux à quatre heures pour chaque noyau. Et en plus il ne faut pas toucher la machine pendant la prise de données pour ne pas fausser les résultats. 
Les scripts préparés pour Gnuplot sont OK, ils génèrent bien les graphes escomptés, maintenant il faut essayer d'en extraire la quintessence pour la présenter. On peut déjà dire que certains résultats sont un peu curieux et n'ont pas d'explication immédiate, d'autres sont plus évidents et vont dans le sens prévu. Il semble toutefois que les disques SSD ne soient pas la panacée malgré un certain nombre d'avantages. 
Il semble par ailleurs que "iozone" soit partiellement inadapté aux disques modernes munis de cache très importants. Les disques SATA ont 8Mo de cache sur la machine quadcore et 32Mo sur la machine dualcore. Les caches des disques SSD sont encore plus volumineux : 64 Mo. 
Très bientôt les premiers résultats, la structure d'accueil est prête ...

SSD : IOZONE lecture

SSD : IOZONE lecture jpp

Résultats en lecture, tous les résultats sont donnés pour les deux versions de noyau choisies 2.6.31 et 2.6.33. 
Dualcore

De grosses différences se manifestent, d'une part dans les "petits" fichiers où la taille du cache du disque semble prépondérante, le noyau 2.6.33 donne de superbes résultats sur le disque "classique" pour les petites tailles de fichiers, le SSD l'emporte dès que la taille des fichiers augmente. Le noyau 2.6.33 semble "brider" la performance du SSD. 
Remarque : le SSD semble plus beaucoup plus sensible à la taille des enregistrements, il prend l'avantage dès que la taille des enregistrements dépasse 128 octets. 

Quadcore :

La forme des courbes est beaucoup plus régulière que sur le dualcore, le SSD prends l'avantage dès les petites valeurs d'enregistrements et accentue son avance lorsque l'enregistrement s'allonge. 
La vitesse maxi du SSD est moindre que pour le dualcore, ce qui semble normal au vu des types de disques. La courbe des disques SATA est plus régulière et plus "pentue" que pour le dualcore, est-ce une influence de la taille de cache beaucoup plus réduite. 

Conclusion : avantage au SSD dès que la longueur des enregistrements dépasse 32, l'avantage s’accroît avec la taille des fichiers et celle des enregistrements.

SSD : IOZONE lecture random

SSD : IOZONE lecture random jpp

Résultats en lecture "random", tous les résultats sont donnés pour les deux versions de noyau choisies 2.6.31 et 2.6.33. 
Dualcore

Les résultats sont bien ceux attendus, le SSD gagne haut la main. Le fait de ne pas avoir de délai rotationnel ni de temps de déplacement des têtes permet au SSD de dominer très largement dès que l'on sort un peu des caches (au delà de 32Mo). Le noyau 2.6.33 semble exploiter mieux les caches du disque "classique" pour les petits fichiers ( < taille du cache) où la vitesse atteint des sommets impressionnants. 

Quadcore :

Les caches plus petits des disques classiques donnent un aspect beaucoup plus "lisse" aux graphes, le SSD gagne là aussi haut la main quel que soit le noyau. Les résultats sont équivalents pour les deux noyaux testés. 

Conclusion : les disques SSD gagnent logiquement ce match, les délais (rotationnels et piste à piste) sont ici très défavorables qux disques "classiques".

SSD : IOZONE écriture

SSD : IOZONE écriture jpp

Résultats en écriture, tous les résultats sont donnés pour les deux versions de noyau choisies 2.6.31 et 2.6.33. 
Dualcore

Des résultats curieux, l'avantage reste au SSD mais le noyau 2.6.33 donne de très bonnes performances au disque "classique" en exploitant beaucoup mieux les caches (très visible sur les petites tailles de fichiers) alors qu'avec le 2.6.31 les résultats sont très faibles pour le disque "classique" sans aucune explication évidente. 

Quadcore :

Là c'est spécial, le SSD est très lent (!), alors que le SATA se comporte beaucoup mieux. Aucune explication évidente à part les contrôleurs disques et les drivers associés ou encore ce disque SSD pas bon en écriture ? 

Conclusion : sur ce test une des deux machines donne un résultat contraire à la logique et franchement surprenant sans explication évidente. A ce sujet voir l'article sur le TRIM.

SSD : IOZONE écriture random

SSD : IOZONE écriture random jpp

Résultats en écriture "random", tous les résultats sont donnés pour les deux versions de noyau choisies 2.6.31 et 2.6.33. 
Dualcore :

Les résultats sont "logiques" et montrent un net avantage au SSD qui tire avantage de sa structure "statique". Les caches permettent qu disque "classique" de faire illusion sur les fichiers de petite taille ( < taille du cache). 

Quadcore :

Même résultats "illogiques", le disque "classique" l'emporte sur le SSD dans la plupart des configurations sans aucune explication évidente. 

Conclusion : sur le dualcore le SSD l'emporte de manière évidente, sur le quadcore il se passe quelque chose de très défavorable au SSD et les résultats du disque "classique" ne sont même pas bons. Une vérification s'impose au niveau du paramétrage de chaque système. Voir à ce sujet l'article sur le TRIM.

SSD : mesures, gnuplot

SSD : mesures, gnuplot jpp

Ayant passé quelques heures à rechercher les "bons" paramètres pour gnuplot je ne résiste pas et vous livre le script qui permet de réaliser ces beaux dessins :

set terminal png size 600,800 
# Paramètres 
# X = COL 1 (taille fichier) 
set xrange [4096:1200000] 
set logscale x 
set xtics ("4M" 4096,"8M" 8192,"16M" 16384,"32M" 32768,"64M" 65536,"128M" 131072,"256M" 262144,"512M" 524288,"1G" 1048576," " 1200000) 

# Y = COL 2 (taille record) 
set yrange [16:512]; 
set logscale y 
set ytics  (16,32,64,128,256,512) 

# Z = valeur (affichée en "vertical") 
set zrange [1000:45000] 
set ztics 4500 

set grid xtics ytics ztics 

set title "Graphe pour write  QUAD 2.6.33" 

# rotation de l'image 
# Paramètres  1 = haut bas, 2 = rotation "verticale", 3 = scale x, 4 = scale Y 
set view 82,30,1,1 
show view; 

# paramètres des graphes 
# pas toujours beau de cacher 
# set hidden3d 

set ticslevel 0 

# Dessin de la courbe 
set output './GR3D_write.png' 

# Les valeurs sont 1      2      3 
#                  Horiz  Prof   Vert 
# --> seule la colonne 3 change 

splot './GR3D_SATA.data' using 1:2:3 with linespoints title "Sata" ,\ 
      './GR3D_SSD.data' using 1:2:3 with linespoints title "SSD" 

Les données issues de IOZONE se présentent sous la forme suivante : 
4096      16    5186   16680    14973    16750   43991   19815   17172    35960    16189   271512   637599 
41750  1252212 
8192      16    1434    9323    28470    30851   49824   11009   12213    22726    23055   261390   647544 
1321294  1332670 
16384      16    2342    8505    34228    44150   49955    5517   23756    28867    29089   266250   645243 1329232  1349806 
32768      16    1910    7892    46899    52612   49608    5493   31623    48795    40638   262227   637958 1308162  1318313 
65536      16    1901   15269    57790    59384   50686    5318   38498    38474    45373   262871   636297 1325699  1338611 
131072      16    2056   13492    50604    63858   50527    5627   46133    40310    48394   259907   629282 
1303419  1313993 
262144      16    2109   15342    56704    68718   48837    6939   49306    30937    49158   261380   648884 1312499  1319461 
524288      16    2210   14232    67886    68860   49550    6104   49283    48960    49798   249599   626107  423431  1334324 

Pour chaque longueur d'enregistrement. L'association du script et des données (pour toutes les longueurs d'enregistrement donne les jolis dessins suivants:

  • En "horizontal" la taille de fichier (4M à 1024M)
  • En "profondeur" la taille d'enregistrement (16 à 512)
  • En "hauteur" la valeur de la donnée en KO/seconde

C'est y pas beau ?

 
 

Tester BTFRS

Tester BTFRS jpp

Le nouveau/futur système de fichiers pour Linux semble être BTRFS car celui-ci est censé apporter un certain nombre de nouveautés et de facilités que d'autres systèmes (Solaris 10?) possèdent et qui simplifient la vie des administrateurs.

La possibilité d'agrandir, de réduire des FS, de jouer avec les modes RAID et d'effectuer des "snapshots" de manière simple et au sein du même outil devrait apporter beaucoup plus de souplesse au niveau de l'administration.

Mais BTRFS n'est pas encore prêt pour passer en production et les outils en version 0.19 rappellent bien que ce système est encore en période de rodage ! 
Note 2016 : BTRFS est maintenant "adulte" et suffisamment stable pour la production.

Je vous propose toutefois quelques tests "pour voir".

Première approche de BTRFS

Première approche de BTRFS jpp

Le premier test est juste destiné à apprendre le fonctionnement basique des outils liés à BTRFS il a été executé sur des volumes LVM créés pour l'occasion avant de passer au travail sur des partitions physiques. 
Mais, ATTENTION, la version des outils n'est (sur Debian unstable) encore que "0.19+20120328-1". Cela bouge mais la version "stable" 1.0 est peut-être encore assez loin. 
Pour tester BTRFS il faut un noyau dont le support BTRFS est activé ! Si, comme c'est probable le support BTRFS est compilé en module un simple : 
modprobe btrfs 
devrait vous renseigner : 
FATAL: Module btrfs.ko not found. 
ou bien meilleur aucun message et un code retour 0. 
Ce support devrait être actif pour les noyaux récents de la plupart des distributions, sinon compilez le vous même et installez le. Les tests sont réalisés avec un noyau très récent (3.4.4) afin de bénéficier des dernières corrections. 
Ensuite il faut charger les outils BTRFS pour disposer, entre autres, de mkfs.btrfs. Sur Debian le paquet se nomme "btrfs-tools" sans autre complication et s'installe rapidement. 
Pour ce premier test j'ai créé deux "disques" LVM de 20G nommés : 
VOL_EXT4 et VOL_BTRFS. Le premier sera formaté classiquement en EXT4, le secon en BTRFS. 
La commande "mkfs.btrfs" assure le formatage et la labellisation, ici : 
date ; mkfs -t btrfs -L DISK_BTRFS /dev/mapper/TALE-VOL_BTRFS ; date 
vendredi 4 mai 2012, 19:55:30 (UTC+0200) 

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL 
WARNING! - see http://btrfs.wiki.kernel.org before using 

fs created label DISK_BTRFS on /dev/mapper/TALE-VOL_BTRFS 
    nodesize 4096 leafsize 4096 sectorsize 4096 size 20.00GB 
Btrfs Btrfs v0.19 
vendredi 4 mai 2012, 19:55:30 (UTC+0200) 

Le résultat est quasi instantané ! 

En EXT4 : 
date; mkfs -t ext4 /dev/mapper/TALE-VOL_EXT4 ; date 
vendredi 4 mai 2012, 19:56:52 (UTC+0200) 
mke2fs 1.42.2 (9-Apr-2012) 
Filesystem label= 
OS type: Linux 
Block size=4096 (log=2) 
Fragment size=4096 (log=2) 
Stride=0 blocks, Stripe width=0 blocks 
1310720 inodes, 5242880 blocks 
262144 blocks (5.00%) reserved for the super user 
First data block=0 
Maximum filesystem blocks=4294967296 
160 block groups 
32768 blocks per group, 32768 fragments per group 
8192 inodes per group 
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000 
Allocating group tables: done                             
Writing inode tables: done                             
Creating journal (32768 blocks): done 
Writing superblocks and filesystem accounting information: done    
vendredi 4 mai 2012, 19:56:54 (UTC+0200) 

Deux secondes pour 20G, donc plus de trois minutes pour un disque de 2To. On monte ensuite les deux partitions et on vérifie : 
df | grep mnt 
/dev/mapper/TALE-VOL_EXT4    20907056    440692  19417788   3% /mnt/VOL_EXT4 
/dev/mapper/TALE-VOL_BTRFS   20971520       120  18845632   1% /mnt/VOL_BTRFS 
Tiens ETX4 consomme 3% ?

Tests "dd" en écriture, fichier de 8Go :  
Pour EXT4 wait 37 .. 75%    BO # 65000 .. 136000 (chiffres de "vmstat")  
256000+0 records in 
256000+0 records out 
8388608000 bytes (8,4 GB) copied, 63,0721 s, 133 MB/s

Pour BTRFS wait 29.. 55%          BO # 68000 .. 180000  
256000+0 records in 
256000+0 records out 
8388608000 bytes (8,4 GB) copied, 60,2699 s, 139 MB/s

Tests "dd" en écriture, fichier de 16Go : 

Pour EXT4 wait 37 .. 75% output # 65000 .. 136000 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 136,869 s, 123 MB/s 

Pour BTRFS wait 29.. 55% output # 68000 .. 190000 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 123,338 s, 136 MB/s 

La vitesse du BTRFS n'est que très peu supérieure mais les "wait_states" sont inférieurs (mesuré avec vmstat) mais reste plus constante pour les fichiers de 8G et 16G. 

Tests "dd" en lecture, fichier de 16Go : 

EXT4 : 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 125,661 s, 134 MB/s 

BTRFS : 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 119,848 s, 140 MB/s 

Léger avantage à BTRFS.

Aucune commande complexe n'a été utilisée ici, la seule différence est la pose du label de FS par "mkfs.btrf" qui simplifie un peu les commandes. 
Les tests précédents ont étés réalisés avec un noyau "xenifié", ci-dessous le même test sur la même version de noyau (3.3.4) en mode "normal" : 
Test "dd" en lecture fichier 16Go :

EXT4 : 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 108,485 s, 155 MB/s 
BTRFS : 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 99,3723 s, 169 MB/s 

Les résultats sont meilleurs laissant toujours un léger avantage à BTRFS. 
J'ai prévu de présenter plus loin quelques possibilités attrayantes et les outils qui permettent d'y arriver. C'est tout pour aujourd'hui ... à la prochaine.

BTRFS : après quelques mois

BTRFS : après quelques mois jpp

Après plusieurs mois d'usage BTRFS se comporte très bien. 
J'ai eu un plantage (corruption) tout à fait au début mais les outils de réparation du FS ont fonctionné correctement bien que m'ayant rappelé avant lancement qu'ils n'etaient que des versions "beta" encore incomplètes.

Depuis je suis passé à des versions de noyau très récentes (3.5 et 3.6 maintenant) et je n'ai plus souffert d'un seul ennui. Je pense que le support BTRFS a été amené à maturité dans les dernières versions de noyau et qu'il est parfaitement envisageable de l'utiliser. J'ai d'ailleurs transféré tous mes répertoires personnels sur une partition RAID (/dev/mdx) formatée en BTRFS.

Au vu des sauvegardes que j'effectue régulièrement je n'ai pas vraiment testé les "snapshots" de BTRFS. 
Note 2016 : pas d'ennuis avec les noyaux de la série 4.x.
Note 2024 : BTRFS est toujours là et fonctionne normalement avec un noyau 6.7.

RAID1 BTRFS et EXT4

RAID1 BTRFS et EXT4 jpp
Pour ce deuxième test je me propose d'utiliser une paire de disques de 2To que je viens d'installer et qui ont été découpés de manière identique dans le but d'utiliser du RAID-1, j'aime bien le RAID 1 !
Les disques SDC et SDD sont découpés en trois partitions :
1 #400Go
2 #400Go
3 #1200Go déja utilisée par LVM
Sur les deux paires de partitions libres ( 1 et 2 ) j'ai installé du RAID-1 par les commandes suivantes :
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc2 /dev/sdd2
Les premiers tests utiliserons EXT4 sur les deux devices MD0 et MD1, ces mêmes devices seront ensuite formatés en BTRFS. Un dernier essai sera par la suite réalisé en "cassant" le RAID-1 et en utilisant directement les possibilités de BTRFS de gestion RAID.
Pour m'affranchir un peu plus de l'influence de la mémoire j'utilise des fichiers un peu plus gros d'environ 40Go.
Après formatage d'une durée d'environ 5 secondes malgré la taille des partitions (400Go) le montage réussit :
df | grep mnt
/dev/md0                    418970516  6325372 391673684   2% /mnt/DISK1
/dev/md1                    418970516  6325372 391673684   2% /mnt/DISK2
 
Pour avoir une plus faible influence des caches mémoire j'ai utilisé les options "direct" et "fsync" de la commande "dd" :
dd if=/dev/zero of=/mnt/DISK1/test bs=32K count=1536000 conv=fsync oflag=direct
 
Tests "dd" écriture en EXT4
Partition 1 (la plus centrale)
Wait state #23%   BO # 55000 .. 73000
1536000+0 records in
1536000+0 records out
50331648000 bytes (50 GB) copied, 939,719 s, 53,6 MB/s
 
Partition 2 (plus vers l'extérieur du disque)
1536000+0 records in
1536000+0 records out
50331648000 bytes (50 GB) copied, 1025,07 s, 49,1 MB/s
 
Comme prévu les disques sont plus rapides sur la première partition que sur la deuxième et pendant le test aucune mémoire "cache" n'est utilisée.
 
Tests "dd" lecture en EXT4:
Partition 1
wait_state #23%  BI # 85000 .. 125000
1536000+0 records in
1536000+0 records out
50331648000 bytes (50 GB) copied, 418,11 s, 120 MB/s
Partition 2
Wait state #23%  BI # 100000 .. 118000
1536000+0 records in
1536000+0 records out
50331648000 bytes (50 GB) copied, 451,569 s, 111 MB/s
 
Là aussi la partition 2 est moins rapide que la première mais, vu la vitesse constatée, il semble que les lectures soient bien partagées sur les deux disques ce qui est un bon présage.
 
Après cette première salve de tests on va passer en BTRFS :
mkfs -t btrfs -L DISK1 /dev/md0
samedi 5 mai 2012, 17:23:48 (UTC+0200)
WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label DISK1 on /dev/md0
nodesize 4096 leafsize 4096 sectorsize 4096 size 400.00GB
Btrfs Btrfs v0.19
samedi 5 mai 2012, 17:23:48 (UTC+0200)
 
mkfs -t btrfs -L DISK2 /dev/md1
samedi 5 mai 2012, 17:23:48 (UTC+0200)
WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label DISK2 on /dev/md1
nodesize 4096 leafsize 4096 sectorsize 4096 size 400.00GB
Btrfs Btrfs v0.19
samedi 5 mai 2012, 17:23:48 (UTC+0200)
et on monte nos deux devices :
df | grep mnt
/dev/md0                    419429240       56 417303360   1% /mnt/DISK1
/dev/md1                    419429240      120 401574656   1% /mnt/DISK2
 
Tests "dd" écriture BTRFS
La syntaxe de "dd" est identique a celle adoptée pour EXT4.
Partition 1:
wait_state #19%   BO 55000 .. 70500
1536000+0 records in
1536000+0 records out
50331648000 bytes (50 GB) copied, 749,723 s, 67,1 MB/s
 
Partition 2:
1536000+0 records in
1536000+0 records out
50331648000 bytes (50 GB) copied, 761,014 s, 66,1 MB/s
 
La différence de vitesse est plus faible entre les deux partitions mais la vitesse d'écriture est largement supérieure à celle obtenue en EXT4 et là non plus aucune trace d'usage de mémoire cache.
 
Tests "dd" lecture BTRFS :
Partition 1
1536000+0 records in
1536000+0 records out
50331648000 bytes (50 GB) copied, 487,854 s, 103 MB/s
 
Partition 2
322696+0 records in
322696+0 records out
10574102528 bytes (11 GB) copied, 103,173 s, 102 MB/s
 
La faible différence de vitesse entre les deux partitions est confirmée mais la surprise est la "faiblesse" de la vitesse en lecture par rapport à EXT4.
Un petit tableau récapitulatif pour finir :
 

  Écriture Lecture
  P. 1 P. 2 P.1 P.2
EXT4 53,6 49,1 120,0 111,0
BTRFS 67,1 66,1 103,0 102,0
% BTRFS / EXT4 +20,12% +25,72% -16,50% -8,82%


La prochaine étape sera de "casser" le RAID de la partition 1 et d'utiliser BTRFS pour gérer le RAID-1.

RAID1 BTRFS et dev/md

RAID1 BTRFS et dev/md jpp

Ce dernier test doit permettre de mesurer toute la puissance et la souplesse de BTRFS car il va ici jouer deux rôles : 
- gestion du RAID 
- gestion du File system 
permettant ainsi de n'utiliser qu'un outil au lieu des deux habituels (Device Mapper ou LVM pour le RAID, Gestionnaire de FS tel EXT3, EXT4 ...). Pour améliorer la fiabilité (et la rapidité ?) les deux disques sont sur deux contrôleurs différents. On utilisera le parametre "odirect" de "dd" pour limiter l'influence de la mémoire. 
D'abord "casser" le RAID actuel, c'est super simple ... 

mdadm -S /dev/md0            # stopper le device 
mdadm --zero-superblock /dev/sde1    # effacer les traces 
mdadm --zero-superblock /dev/sdd1    # sur les deux disques 

Après cette petite opération il est de bon ton de redémarrer le système pour assurer une bonne reconnaissance des changements. effectués.
Sitôt dit, sitôt fait et on enchaîne sur la création de notre RAID1 BTRFS : 
mkfs.btrfs -m raid1 -d raid1 -L BTRFS /dev/sdc1 /dev/sdd1 
WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL 
WARNING! - see http://btrfs.wiki.kernel.org before using 
adding device /dev/sdd1 id 2 
fs created label BTRFS on /dev/sdc1 
    nodesize 4096 leafsize 4096 sectorsize 4096 size 800.00GB 
Btrfs Btrfs v0.19 
On monte ce nouveau FS : 
mount LABEL=BTRFS /mnt/DISK1omount LABEL=BTRFS /mnt/DISK1 
et on vérifie : 
df -k | grep mnt 
/dev/sdc1                   838860800      312 803151616   1% /mnt/DISK1 

Seul le premier disque est visible et le FS est bien noté 800GB. 
Un petit test "dd" en écriture : 
dd if=/dev/zero of=/mnt/DISK1/test bs=32K count=1536000 conv=fsync oflag=direct 
1536000+0 records in 
1536000+0 records out 
50331648000 bytes (50 GB) copied, 1001,96 s, 50,2 MB/s 

Pendant ce temps les deux disques sont actifs, chacun sur leur contrôleur : 
21:06:33 sdd   1577,00      0,00 100928,00     64,00      0,44      0,28      0,28     43,60 
21:06:33 sde   1578,00      0,00 100992,00     64,00      0,75      0,48      0,47     74,80 
Average: sdd   1577,00      0,00 100928,00     64,00      0,44      0,28      0,28     43,60 
Average: sde   1578,00      0,00 100992,00     64,00      0,75      0,48      0,47     74,80 

Pour corser un peu la comparaison je vais profiter de la partition "2" toujours en RAID-1 (Device Manager) pour la formater en BTRFS et comparer ainsi le RAID-1 BTRFS "pur" et le RAID-1 "DM" + BTRFS. La partition 2 étant un peu moins rapide du fait de sa position DM + BTRFS part avec un petit handicap (#5%). 
Les résultats bruts : 
RAID-1 BTRFS : 
1536000+0 records in 
1536000+0 records out 
50331648000 bytes (50 GB) copied, 966,6 s, 52,1 MB/s 
DM + BTRFS : 
1536000+0 records in 
1536000+0 records out 
50331648000 bytes (50 GB) copied, 993,912 s, 50,6 MB/s 
Au vu des chiffres on peut considérer qu'il y a égalité. 
Passons à la lecture et afin de vérifier si les deux disques sont bien utilisés on va tester deux configurations : 
DD avec l'option "idirect" 
DD sans l'option "idirect" 
RAID-1 BTRFS avec "idirect" : 
dd if=/mnt/DISK1/test of=/dev/null bs=32K conv=fsync iflag=direct 
1536000+0 enregistrements lus 
1536000+0 enregistrements écrits 
50331648000 octets (50 GB) copiés, 489,408 s, 103 MB/s 

Sans "idirect" : 
dd if=/mnt/DISK1/test of=/dev/null bs=32K conv=fsync 
dd: fsync a échoué pour « /dev/null »: Argument invalide 
1536000+0 enregistrements lus 
1536000+0 enregistrements écrits 
50331648000 octets (50 GB) copiés, 430,43 s, 117 MB/s 

DM + BTRFS avec "idirect" : 
dd if=/mnt/DISK2/test of=/dev/null bs=32K conv=fsync iflag=direct 
1536000+0 enregistrements lus 
1536000+0 enregistrements écrits 
50331648000 octets (50 GB) copiés, 508,961 s, 98,9 MB/s 

Sans idirect : 
dd if=/mnt/DISK2/test of=/dev/null bs=32K conv=fsync 
1536000+0 enregistrements lus 
1536000+0 enregistrements écrits 
50331648000 octets (50 GB) copiés, 380,004 s, 132 MB/s 

Avec l'utilisation de "idirect" les deux possibilités sont à peu près à égalité. Par contre sans ce flag le couple "DM" + BTRFS est très loin devant ... 
On refait le test en notant l'activité des différents disques sur une vingtaine de secondes : 
RAID1 BTRFS 
sar -pd 2 10 | egrep 'sdd|sde' | grep 'Average' 
Average: sde    309,50 213753,60      0,00    690,64      9,64     31,16      3,12     96,68 
Average: sdd      0,00      0,00      0,00      0,00      0,00      0,00      0,00      0,00 

DM + BTRFS 
Average: sde    187,60 140957,60      0,00    751,37      5,77     30,60      3,80     71,28 
Average: sdd    163,10 109883,20      0,00    673,72      4,26     26,19      3,96     64,56 

On remarque tout de suite que BTRFS n'utilise qu'un disque au cours de ce test alors que DM en utilise deux ce qui explique probablement la meilleure vitesse obtenue. 
Remarque : lors d'un deuxième test BTRFS a utilisé l'autre disque il est donc probable que sur plusieurs IO simultanées il est capable de se servir des deux disques. 
On vérifie avec deux "dd" en parallèle : 
Average: sde    937,40 207295,20      0,00    221,14     28,18     29,98      1,06     99,60 
Average: sdd      0,00      0,00      0,00      0,00      0,00      0,00      0,00      0,00 
Et bien non il se sert d'un seul disque ? Et avec deux fichiers différents que va-t-il se passer ? 
On copie d'abord une partie de notre fichier de 50G : 
RAID1 BTRFS 
dd if=test_UN of=test_DX bs=32K count=512000 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 376,779 s, 44,5 MB/s 
Pendant la copie un seul disque est utilisé en lecture et bien sûr les deux en écriture. 
La vitesse est sensiblement moindre que lors des tests d'écriture seule 44,5 contre 52,1. 

DM + BTRFS 
dd if=test_UN of=test_DX bs=32K count=512000 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 339,194 s, 49,5 MB/s 
Presque la vitesse en écriture seule 49,5 contre 50,6 ! Pendant la copie les deux disques sont utilisés en lecture et en écriture. 
Le test avec deux fichiers 
RAID1 BTRFS : 
Un seul des deux disques est utilisé et le contrôleur est à 100%, le temps de WAIT est élevé (30 à 45%) le CPU utilisé est de l'ordre de 10%  : 
Average: sde    202,70 204479,60      0,00   1008,78     23,49    116,10      4,93    100,00 
Average: sdd      0,00      0,00      0,00      0,00      0,00      0,00      0,00      0,00 
Fichier 1 ; 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 319,734 s, 52,5 MB/s 
Fichier 2 : 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 260,957 s, 64,3 MB/s 
Soit un total d'environ 117Mo/seconde parfaitement égal au test précédent. 
DM BTFRS 
Les deux disques sont utilisés et les deux contrôleurs à 100%, le temps de WAIT est très élevé (40 à 60%), le cpu utilisé varie de 14 à 28% : 
Average: sde    227,85 218987,20      0,00    961,10     13,08     57,72      4,39    100,00 
Average: sdd    210,60 215552,00      0,00   1023,51     11,94     56,74      4,74     99,92 
Fichier 1 : 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 99,329 s, 169 MB/s 
Fichier 2 : 
512000+0 records in 
512000+0 records out 
16777216000 bytes (17 GB) copied, 155,029 s, 108 MB/s 

Soit un maximum de plus de 270 Mo/seconde ! J'ai refait le test en notant les vitesses moyennes de chaque disque (je rappelle que si les disques sont identiques ce n'est pas le cas des contrôleurs) : 
Average: sde    214,20 219289,60      0,00   1023,76     11,50     53,70      4,66     99,78 
Average: sdd    191,00 165808,40      0,00    868,11      9,27     48,44      5,02     95,92 
Un des disques va nettement plus vite ! Lors de ce second essai j'ai obtenu 150 et 112Mo/seconde soit environ 260Mo/seconde, ce qui est en phase avec le premier essai. 

En bref DM + BTRFS ça a l'air de déménager. Ce petit problème réglé je vais remettre la partition 1 en mode "DM". 
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdd1 /dev/sde1 
On reboote par précaution ... et on lance 
mkfs -t btrfs -L BTRFS_1 /dev/md0 
WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL 
WARNING! - see http://btrfs.wiki.kernel.org before using 

fs created label BTRFS_1 on /dev/md0 
    nodesize 4096 leafsize 4096 sectorsize 4096 size 399.87GB 
Btrfs Btrfs v0.19 
Et la synchronisation du raid commence : 
md0 : active raid1 sdd1[0] sde1[1] 
      419299136 blocks super 1.2 [2/2] [UU] 
      [>....................]  resync =  0.1% (515264/419299136) finish=67.7min speed=103052K/sec 
Ces nouveaux disques de 2To semblent nettement plus rapides que les "anciens" disques de 750 Go (2 and déjà) déja présents dans la machine. 
Ne pas oublier ensuite de positionner ce nouveau "raid" dans le fichier "/etc/..../mdadm.conf", 
mdadm --examine --scan 
est votre ami. 
Il est toutefois à noter que j'ai eu quelques plantages système, crash complets sans possibilité de reprendre la main ou "ooops" déclenchant une violation de protection mémoire de "dd" et un crash lors de l'utilisation de "cp -dpR" pour recopier une arborescence complète.

Ces plantages ont eu lieu avec des noyaux < 3.3. Avec un noyau 3.3.5 les plantages ont été moins nombreux, j'ai depuis refait quelques tests avec un noyau 3.4-rc7 pendant lesquels je n'ai noté aucun ennui, les "cp -dpR" ont parfaitement fonctionné malgré les plus de 80Go à recopier (#500 000 répertoires et plus de 2 000 000 fichiers). 
J'ai mis pour le moment mon répertoire personnel (que je sauvegarde souvent) sur une partition en RAID1 DM+BTRFS. Les résultats sont pour le moment excellents, l'affichage de photos me semble beaucoup plus rapide qu'avant malgré les 15 à 19Mo de chaque photo.

Un autre test fait sur mon répertoire HOME (maintenant en BTRFS) recopié pour sauvegarde dans une baie externe : 
Environ 16 Go avec  #5700 répertoires et #57000 fichiers (Pas mal de fichiers photo RAW et JPG de 10 à 15Mo chacun) en un peu moins de 4 minutes soit une vitesse moyenne de # 66Mo/seconde comprenant donc lecture sur BTRFS et écriture sur une partition LVM de la baie. 
Ainsi la copie de sauvegarde devient (presque) un plaisir.

Passer en RAID 1

Passer en RAID 1 jpp

Note : le système est un Debian "Jessie" mais la plupart des remarques peuvent s'appliquer à d'autres distributions. 
Sur la machine qui me sert de frontal Internet j'ai eu de multiples alertes "Smart" me signalant des dégradations sur des "seek..." et quelques autres anomalies. Ces disques sont assez anciens et très sollicités car la machine fonctionne 24/24 et héberge plusieurs services : mail, DNS, DHCP, serveur Apache, agent centralisateur de collectd, une base Mysql ainsi que Suricata et Snorby. Les deux disques de cette machine (500Go) deviennent par ailleurs un peu petits. Ils sont montés en LVM, chaque volume LVM est mirroré, mais c'est un peu lourd à gérer. Le système est sur un petit SSD que je sauvegarde régulièrement. 
J'ai donc décidé de changer les disques et de mettre deux disques en RAID1 sur lesquels je mettrais trois partitions, dont deux avec LVM, plus un swap. Il ne faut pas oublier de charger le paquet "mdadm" pour disposer des outils adéquats.  
Comme le contrôleur supporte 4 disques j'ai pu monter un des futurs disques en plus afin de : 
- Le partitionner :

  1. une partition pour le système,
  2. une pour les disques des machines virtuelles,
  3. une pour le stockage des données
  4. une de swap.

Ensuite :

  • Créer le Raid1 avec une seule patte.
  • Créer les PV pour LVM sur les partitions 2 et 3
  • Charger les données, du système et copier les images de machines virtuelles.

Pour ceci il est nécessaire de stopper le maximum de services afin de ne pas se compliquer la tâche. 
Ne pas oublier de mettre les partitions en type "Linux RAID" dans fdisk (type "fd") : 
Command (m for help): t 
Partition number (1-4, default 4): 1 
Partition type (type L to list all types): 21 
Changed type of partition 'Linux RAID' to 'Linux RAID'. 
... idem pour les autres partitions. 
On arrive alors à ceci dans fdisk :

Disk /dev/sdc: 931,5 GiB, 1000204886016 bytes, 1953525168 sectors 
Units: sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes / 4096 bytes 
I/O size (minimum/optimal): 4096 bytes / 4096 bytes 
Disklabel type: gpt 
Disk identifier: 48D952DA-AF21-46D3-BB36-73DFFF32A96A 
Device          Start        End   Sectors  Size Type 
/dev/sdd1        2048  536872959 536870912  256G Linux RAID 
/dev/sdd2   536872960 1073743871 536870912  256G Linux RAID 
/dev/sdd3  1073743872 1912604671 838860800  400G Linux RAID 
/dev/sdd4  1912604672 1953525134  40920463 19,5G Linux RAID

Ensuite il faut créer nos "RAID" en mettant à chacun un disque physique et un disque "missing" : 
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdd1 
.... 
Puis enregistrer la config de nos RAID pour qu'ils soient reconnus au boot avec : 
mdadm --examine --scan >>/etc/mdadm/mdadm.conf 
Vous pouvez ensuite modifier dans ce fichier l'adresse mail de destination des messages. 
Il est prudent de redémarrer la machine pour vérifier que nos RAID sont bien accrochés et se retrouvent après redémarrage.

On arrive alors a "voir" l'état de nos RAID en exécutant :  
cat /proc/mdstat 
Personalities : [raid1]  
md3 : active raid1 sdc2[1] 
      268304384 blocks super 1.2 [2/1] [_U] 
      bitmap: 1/2 pages [4KB], 65536KB chunk

md4 : active raid1 sdc3[1] 
      419299328 blocks super 1.2 [2/1] [_U] 
      bitmap: 1/4 pages [4KB], 65536KB chunk

md5 : active raid1 sdc4[1] 
      20443840 blocks super 1.2 [2/1] [_U] 
       
md2 : active raid1 sdc1[1] 
      268304384 blocks super 1.2 [2/1] [_U] 
      bitmap: 2/2 pages [8KB], 65536KB chunk

unused devices: <none> 
------------------------------------------------------- 
Le système signale par ailleurs dans les logs lors du démarrage que les RAID ne sont pas en bon état : 
Nov 25 13:24:49 xxxxxx systemd-fsck[408]: /dev/md2 : propre, 17129/16769024 fichiers, 10491322/67076096 blocs 
Nov 25 13:24:49 xxxxxx systemd-fsck[516]: BOOT : propre, 326/1222992 fichiers, 139566/4882432 blocs 
Nov 25 13:24:49 xxxxxx mdadm-raid[196]: Assembling MD array md2...done (degraded [1/2]).

et mdadm-raid vous envoie régulièrement des mails tels que : 
This is an automatically generated mail message from mdadm 
running on xxxxxx.xxx.xxx

A DegradedArray event had been detected on md device /dev/md/4.

Faithfully yours, etc.

P.S. The /proc/mdstat file currently contains the following:

Personalities : [raid1] 
md4 : active raid1 sdc3[1] 
      419299328 blocks super 1.2 [2/1] [_U] 
      bitmap: 1/4 pages [4KB], 65536KB chunk

md5 : active raid1 sdc4[1] 
      20443840 blocks super 1.2 [2/1] [_U] 
....... 
------------------------------------------------------- 
On peut alors : 
Formater la première partition en ext4 
Recopier les répertoires système du vieux disque, /var, quelques morceaux de /usr ... sur la première partition, "cp -dpRx" est votre ami. 
Créer le PV LVM sur la deuxième partition puis créer les volumes logiques destinés à mes machines virtuelles (je ne le fais pas à la main mais avec "kvpm" que j'aime bien). 
Stopper les machines virtuelles et copier leurs images disque, bêtement avec : 
"dd if=ancien of=nouveau bs=65536" et cela marche très bien. 
J'ai ensuite modifié le fichier /etc/fstab" pour monter les "nouvelles" partitions à la place des "anciennes", les anciennes sont toujours là (au cas ou ?). 
Modifié les scripts de lancement des MV pour utiliser les nouveaux volumes et redémarré. 
Super, tout se passe bien, le système est OK, les MV ont bien démarré et leurs services sont accessibles. Je vais pouvoir démonter les anciens disques.  
Je stoppe encore la machine, démonte les anciens disques et je les stocke dans un coin tranquille (encore au cas ou) et monte le nouveau disque encore vierge.  
Il fait alors recommencer le partitionnement de ce nouveau disque, sans oublier de mettre le type de partition à "Linux RAID". 
Faire gaffe au nom des disques, car le démontage des anciens disques décale tout. On arrive presque à la fin on va, enfin, créer un vrai RAID1 avec deux disques : 
mdadm --manage /dev/md2 --add /dev/sdb1

cat /proc/mdstat 
Personalities : [raid1]  
md3 : active raid1 sdc2[1] 
      268304384 blocks super 1.2 [2/1] [_U] 
      bitmap: 1/2 pages [4KB], 65536KB chunk

md4 : active raid1 sdc3[1] 
      419299328 blocks super 1.2 [2/1] [_U] 
      bitmap: 1/4 pages [4KB], 65536KB chunk

md5 : active raid1 sdc4[1] 
      20443840 blocks super 1.2 [2/1] [_U] 
       
md2 : active raid1 sdb1[2] sdc1[1] 
      268304384 blocks super 1.2 [2/1] [_U] 
      [>....................]  recovery =  0.2% (781056/268304384) finish=28.5min speed=156211K/sec 
      bitmap: 2/2 pages [8KB], 65536KB chunk

La synchronisation de la première partie du RAID /dev/md2 est commencée et prévue pour un peu moins de 30 minutes, ne pas être pressé et éviter le café car il y a d'autres RAID à compléter. 
La vitesse de construction varie un peu mais reste supérieure à 100000K/sec mais la première partition fait 256G, la plus grosse 400G ce qui va durer une éternité. 
La première partition contient beaucoup de fichiers "actifs", par exemple tous les logs, la base de données mysql .... cela devrait augmenter le temps de construction. Mais, un peu plus tard : : 
md2 : active raid1 sdb1[2] sdc1[1] 
      268304384 blocks super 1.2 [2/1] [_U] 
      [================>....]  recovery = 84.4% (226534144/268304384) finish=6.7min speed=103609K/sec 
      bitmap: 2/2 pages [8KB], 65536KB chunk 
Ca s'approche de la fin .... toujours à un peu plus de 100MO/seconde. Au passage "iotop" ne voit rien et affiche des chiffres "ridicules". 
Nov 25 19:16:52 xxxxxx kernel: [  939.531841] md: recovery of RAID array md2 
Nov 25 19:59:28 xxxxxx kernel: [ 3493.885198] md: md2: recovery done. 
43 minutes environ au lieu des #30 annoncées. 
  
Pour la partition suivante il y a deux disques de machines virtuelles, je ne vais pas les stopper avant de commencer la construction du RAID pour environ 30 minutes annoncées. 
Nov 25 20:34:04 xxxxxx kernel: [ 5569.372170] md: recovery of RAID array md3 
Nov 25 21:24:56 xxxxxx kernel: [ 8618.957262] md: md3: recovery done. 
Soit environ 50 minutes. 
J'aurais mieux fait de stopper les MV car l'une d'elle a eu un problème lors du redémarrage (fsck manuel obligatoire).

Passons à la partition de 400G. 
mdadm --manage /dev/md4 --add /dev/sdb3 
mdadm: added /dev/sdb3 
date 
mercredi 25 novembre 2015, 21:28:55 (UTC+0100) 
Et quelques instants plus tard : 
cat /proc/mdstat 
Personalities : [raid1]  
md4 : active raid1 sdb3[2] sdc3[1] 
      419299328 blocks super 1.2 [2/1] [_U] 
      [=>...................]  recovery =  6.5% (27293696/419299328) finish=95.4min speed=68420K/sec 
      bitmap: 0/4 pages [0KB], 65536KB chunk 
La vitesse n'est "que" de 68Mo/seconde ? On doit approcher le milieu du disque ??? 
Beaucoup plus tard ... : 
cat /proc/mdstat 
Personalities : [raid1]  
md4 : active raid1 sdb3[2] sdc3[1] 
      419299328 blocks super 1.2 [2/1] [_U] 
      [=======>.............]  recovery = 36.8% (154667968/419299328) finish=70.2min speed=62746K/sec 
      bitmap: 0/4 pages [0KB], 65536KB chunk 
date 
mercredi 25 novembre 2015, 22:05:02 (UTC+0100) 
En 37 minutes le temps restant n'a que diminué de 25 minutes .... que dire du résidu de 70 minutes ? Ensuite en 20 minutes le temps restant a diminué de 15 minutes. 
A 22:40 ( durée 72 minutes) il reste encore 36 minutes .... 
cat /proc/mdstat ; date 
Personalities : [raid1]  
md4 : active raid1 sdb3[2] sdc3[1] 
      419299328 blocks super 1.2 [2/1] [_U] 
      [=================>...]  recovery = 89.9% (377065408/419299328) finish=13.5min speed=52082K/sec 
      bitmap: 0/4 pages [0KB], 65536KB chunk 
mercredi 25 novembre 2015, 23:09:29 (UTC+0100) 
Les 100 minutes sont atteintes il n'en reste plus que 13,5 mais la vitesse est tombée à 52MO/seconde. Pour finir : 
Nov 25 21:28:53 xxxxxx kernel: [ 8856.327974] md: recovery of RAID array md4 
Nov 25 23:24:41 xxxxxx kernel: [15800.532184] md: md4: recovery done. 
1h56 minutes soit 116 minutes, heureusement que je n'ai pas utilisé des disques de 3To !

La dernière partition (futur SWAP) ne fait que 19G, cela devrait aller vite : 
md5 : active raid1 sdb4[2] sdc4[1] 
      20443840 blocks super 1.2 [2/1] [_U] 
      [>....................]  recovery =  1.5% (311040/20443840) finish=9.7min speed=34560K/sec 
Par contre même pas 35MO/seconde ! Cette partie du disque est vraiment moins performante, mais après quelques minutes on monte à environ 45Mo/seconde ce qui est déjà un peu mieux. 
Enfin, c'est fini !  
La machine est sauvée et n'aura peut-être pas d'incident disques avant quelques années ... je croise les doigts. 

 

SSD et machines virtuelles

SSD et machines virtuelles jpp

Ayant eu l'occasion de me procurer deux SSD de 512Go j'ai rapidement décidé de les utiliser pour fournir l'espace disque à quelques machines virtuelles. 

Installation précédente : 
- Deux disques Hitachi Deskstar de 3To montés en miroir (DMRAID) avec deux Volume Group LVM.

Nouvelle installation : 
- Deux disques Samsung SSD 850 PRO 512GB montés en miroir (DMRAID) avec deux VG LVM.

Les deux nouveaux disques sont utilisés comme support d'un Volume Group LVM dans lequel j'ai pu "tailler" l'espace nécessaire à quelques machine virtuelles et d'un autre dédié à une base Mysql de quelques Go utilisées sur le système hôte et il y reste encore un peu de place. 
 La différence est très sensible sur les temps de réponse de la base Mysql : de gros "select count(*) from ..." sont passés de plus d'environ deux minutes à une trentaine de secondes, soit approximativement une performance quatre fois meilleure, comme mesuré dans l'article indiqué ci-dessous. 
 Pour les machines virtuelles la différence est également importante, le serveur Web, sur lequel sont installées ces pages assure un temps de réponse bien meilleur et les statistiques apparaissent bien plus rapidement, décidément Mysql aime les SSD et le montre bien. (Voir article Mysql et SSD). Quand à l'interface d'administration de Drupal il est devenu agréable à utiliser, pratiquement plus d'attente entre les pages. 
Une des MV est un serveur de mail Zimbra dont l'interface d'administration fournit des statistiques diverses dont une sur l'usage CPU. Une des statistiques m'a particulièrement intéressé, celle des IOWait qui est très significative.  
Statistique CPU/IOWAIT

On voit bien la baisse des Cpu_iowait lors du redémarrage de la machine. 

Le ressenti de l'interface Webmail est meilleur la réponse plus franche et plus rapide. 
En bref : les SSD c'est le pied.

Mysql : SSD / HD

Mysql : SSD / HD jpp

Un petit graphe des IO pour les deux machines : 
Graphique IO sur les deux machines lors du comptageSSD

Encore un test SSD/HDD ? J'ai récemment installé une base volumineuse sur une machine munie de SSD et j'ai constaté que les temps de réponse étaient excellents. Afin de quantifier le phénomène j'ai installé la même base sur deux machines différentes (#90 millions de rangs dans la table principale) :

Machine 1 : 
Core I7 6700 à 3.4 Mhz 
RAM : 16Go 
Base sur une partition dédiée d'un ensemble Raid1 sur HDD classique. 
Mysql 5.7.22 Inno_buffers en mémoire classique 
Machine 2 : 
Core I5 7500 à 3.4 Mhz 
Raml : 16Go 
Mysql 5.7.22 Inno_buffers en mémoire "huge pages" 
Base sur une partition dédiée d'un ensemble Raid1 sur SSD. 
Les deux machines sont donc à peu près équivalentes en vitesse au point de vue des CPU puisque Mysql n'utilise qu'un CPU par requête et que le paramétrage de Mysql est identique sur les deux systèmes. Seule différence la machine 2 utilise des "huge pages" pour les buffers InnoDB.

Le premier test consiste à :

  • Récupérer dans une table temporaire des rangs présents sur une autre machine par l'intermédiaire d'une table "federated".
  • Insérer ces rangs dans une table permanente.

Test 1. 
Machine 1 : 
Récupérer 206020 rangs      11.48 sec 
Insérer dans table "réelle"    69.70 sec 
Machine 2 : 
Récupérer 212290 rangs       5,42 sec 
Insérer dans table "réelle"    11,92 sec

Test 2. 
Machine 1 : 
Récupérer 2495 rangs           4,76 sec 
Insérer dans table "réelle"     1,87 sec 
Machine 2 : 
Récupérer 2482 rangs           0,32 sec 
Insérer dans table "réelle"     0,12 sec

Test 3. 
Machine 1 : 
Récupérer 2495 rangs           9,66 sec 
Insérer dans table "réelle"     57,04 sec 
Machine 2 : 
Récupérer 2482 rangs           2,22 sec 
Insérer dans table "réelle"     7.85 sec

Après quelques autres tests le tableau récapitulatif : 

Au final la base sur SSD effectue les opérations presque 5,7 fois plus rapidement.

Tableau à partir des mêmes données mais en rangs traités par seconde : 
 
Pour l'insertion le SSD semble moins "bon" mais cette phase comprends la lecture sur la machine origine et le transfert par le réseau qui sont probablement égaux pour les deux machines. 

Deuxième test : compter les rangs de la plus grosse table. 
Pour ce test :

  1. On redémarre Mysql pour bien vider les caches
  2. On exécute deux comptages successifs (# 90 millions de rangs).

Machine 1 : 
Premier comptage : 48,36 sec 
Comptage suivant : 22,65 sec 
Machine 2 : 
Premier comptage : 22,07 sec 
Comptage suivant : 19,44 sec

Même test le lendemain après ajout de #133000 rangs pour un total de 91176892 
Machine 1 : 
Premier comptage : 52,24 sec 
Comptage suivant : 22,61 sec 
Machine 2 : 
Premier comptage : 21,91 sec 
Comptage suivant : 19,59 sec

La différence est moins importante mais le SSD gagne quand même par plus de 2 à 1 sur le comptage "brut". On constate quand même la bonne efficacité des caches. 
iotop montre de la lecture a #30 Mo/sec pour les HDD et > 60Mo/sec pour les SSD. 
Le deuxième comptage est visiblement effectué sur les caches (peu ou pas d'IO visibles), la différence d'environ 10% est très probablement due à l'usage des "huge pages" pour le cache InnoDB de la machine 2 (large-pages pour Mysql). 
Un petit graphe des IO pour les deux machines : 
Graphique IO sur les deux machines lors du comptage 
Graphique IO sur les deux machines lors du comptage 
Petite bizarrerie au démarrage pour le SSD qui met #7 secondes pour arriver à son plein régime ? 
La même remarque s'applique à plusieurs tests. 
On peut voir par ailleurs que les temps de comptage sur la machine SSD sont très peu différents entre le premier comptage (avec accès disque) et le suivant réalisé immédiatement (ne montrant pas d'IO), les disques SSD ne semblent quasiment pas ralentir le traitement (#10% de différence seulement) par rapport au traitement depuis le cache.

Troisième test : créer un nouvel index. 
L'index est composé de trois champs. 
Machine 1 : 23 min 42,63 sec 
Machine 2 :  5 min 29,11 sec 
Le rapport de durée est d'environ 4,3. 
Pendant l'exécution j'ai vu plus de 240Mo/seconde en lecture sur les SSD contre un peu plus de 60Mo/seconde pour les HDD.

Mysql : SSD or not SSD

Mysql : SSD or not SSD jpp

Afin de mesurer un peu l'influence des disques sur une base Mysql j'ai effectué quelques petits tests par rapport à une base de référence installée sur des disques « classiques » 7200 tours. 
Les test réalisés :

  1.  Sur la machine d'origine (Core I5 à 3.4GHz, disques « classiques »), Mysql 5.6.30
  2.  Sur une autre machine (Corei3 à 3.5GHz, tout SSD) le test est réalisé avec une installation « standard » de Mysql (5.6.30). Donc tout sur le disque système (/var/lib/mysql et /var/log/mysql)
  3.  Toujours sur la machine SSD (5.6.30) avec une installation un peu plus optimisée :
    •      Logiciel sur le SSD système
    •      Données sur un SSD « DATA »    (/var/lib/mysql)
    •      Logs sur un autre SSD « LOG »   (/var/log/mysql + tmpdir)
  4. Le dernier test est réalisé sur la configuration « optimisée » avec la version 5.7.16

La base n'est pas énorme et comporte deux tables principales de # 10 millions et #100000 rangs et "tient" dans # 4Go.

Les résultats sont assez parlants, le passage sur SSD apporte une très nette amélioration de performance et pourtant le SSD supportant le système est un "vieux" modèle qui n'est pas au niveau des derniers modèles. 
Voir un autre test sur le même sujet.

Résultats comparés (Référence en secondes, les autres en % d'amélioration)
N° TEST 5.6.30 secondes (REF) 5.6.30 SSD % Gain sur REF 5.6.30 Opt. % Gain sur REF 5.7.16 Opt. % Gain sur REF
TEST A 1,00 0,00% 0,00% 0,00%
TEST B 3,09 38,51% 80,91% 82,85%
TEST C 1,45 61,38% 74,48% 74,48%
TEST D 0,93 52,69% 80,65% 86,02%
TEST E 5,96 5,70% -0,67% 5,54%
TEST F 41,30 21,57% 57,97% 65,86%
TEST G 13,68 74,12% 89,40% 94,88%
TEST H 26,04 88,86% 92,47% 92,70%
TOTAL 93,45 48,26% 69,06% 73,93%

Et en image cela donne :

 

Dernier test : comptage sur une "grosse" table :

Machine SSD : 
+-----------+ 
| count(*)  | 
+-----------+ 
| 134071332 | 
+-----------+ 
1 row in set (50,52 sec)

Machine HDD : 
+-----------+ 
| count(*)  | 
+-----------+ 
| 134072138 | 
+-----------+ 
1 row in set (4 min 9,46 sec)

Environ 5/1 en faveur du SSD.