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 ?