Un petit graphe des IO pour les deux machines :
SSD
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 :
- On redémarre Mysql pour bien vider les caches
- 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 :
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.