RAID1 BTRFS et dev/md
RAID1 BTRFS et dev/md jppCe 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.