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.