SSD : mesures
SSD : mesures jppLes 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 jppLes 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 jppLa 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 jppDeuxiè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 jppDevant 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 jppLa 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 jppRé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 jppRé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 jppRé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 jppRé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 jppAyant 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 ?