Esperimenti col RAID di Linux
In attesa che mi ritorni il disco da 4T (la mia solita fortuna: lo avevo appena riempito per poco più di metà e ZAP! errori a ripetizione) ho pensato di fare qualche esperimento col RAID, così che quando tornerà non dovrò perdere troppo tempo coi restriping (che su dischi da 4T possono essere "impegnativi").
Inizio creando i file per simulare i dischi e li assegno ad altrettanti loop device:
[root@arwen ~]# for T in $(seq 1 6); do dd if=/dev/zero of=/home/test$T.dat bs=1G count=1; losetup /dev/loop$T /home/test$T.dat; done 1+0 record dentro 1+0 record fuori 1073741824 byte (1,1 GB) copiati, 2,05573 s, 522 MB/s 1+0 record dentro 1+0 record fuori 1073741824 byte (1,1 GB) copiati, 3,35956 s, 320 MB/s 1+0 record dentro 1+0 record fuori 1073741824 byte (1,1 GB) copiati, 5,52633 s, 194 MB/s 1+0 record dentro 1+0 record fuori 1073741824 byte (1,1 GB) copiati, 3,39929 s, 316 MB/s 1+0 record dentro 1+0 record fuori 1073741824 byte (1,1 GB) copiati, 3,91915 s, 274 MB/s 1+0 record dentro 1+0 record fuori 1073741824 byte (1,1 GB) copiati, 6,40068 s, 168 MB/s
Ora creo il RAID5 con solo due dischi e ci metto un filesystem di prova:
[root@arwen ~]# mdadm --create --level=5 --raid-devices=2 /dev/md0 /dev/loop[12]
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@arwen ~]# mke2fs /dev/md0
mke2fs 1.42.5 (29-Jul-2012)
Etichetta del filesystem=
OS type: Linux
Dimensione blocco=4096 (log=2)
Dimensione frammento=4096 (log=2)
Stride=128 blocks, Stripe width=128 blocks
65536 inodes, 261888 blocks
13094 blocks (5.00%) reserved for the super user
Primo blocco dati=0
Maximum filesystem blocks=268435456
8 gruppi di blocchi
32768 blocchi per gruppo, 32768 frammenti per gruppo
8192 inode per gruppo
Backup del superblocco salvati nei blocchi:
32768, 98304, 163840, 229376
Allocating group tables: fatto
Scrittura delle tavole degli inode: fatto
Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem: fatto
[root@arwen ~]# mount /dev/md0 /media/floppy
[root@arwen ~]# dd if=/dev/urandom of=/media/floppy/testfile.dat bs=128k count=1k
1024+0 record dentro
1024+0 record fuori
134217728 byte (134 MB) copiati, 8,59498 s, 15,6 MB/s
[root@arwen ~]# md5sum /media/floppy/testfile.dat
b86cbca40ec49f37aadfc4e3f94d8a15 /media/floppy/testfile.dat
Ed ora inizia la parte divertente.
Prima di tutto verifico che il RAID5 di due dischi si comporti come un RAID1:
[root@arwen ~]# mdadm --fail /dev/md0 /dev/loop2
mdadm: set /dev/loop2 faulty in /dev/md0
[root@arwen ~]# umount /media/floppy
[root@arwen ~]# mount /dev/md0 /media/floppy
[root@arwen ~]# md5sum /media/floppy/testfile.dat
b86cbca40ec49f37aadfc4e3f94d8a15 /media/floppy/testfile.dat
[root@arwen ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 loop2[2](F) loop1[0]
1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/1] [U_]
unused devices:
E fin qui tutto OK come previsto.
Ora gli dico che ho provveduto a sostituire il "disco guasto":
[root@arwen ~]# mdadm --zero-superblock /home/test2.dat
[root@arwen ~]# mdadm /dev/md0 --remove /dev/loop2
mdadm: hot removed /dev/loop2 from /dev/md0
[root@arwen ~]# mdadm /dev/md0 --add /dev/loop2
mdadm: added /dev/loop2
[root@arwen ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 loop2[2] loop1[0]
1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/1] [U_]
[======>..............] recovery = 31.2% (327380/1047552) finish=0.1min speed=109126K/sec
unused devices:
Prima ricostruzione necessaria. Ma OK: vuol dire che effettivamente i dati ci sono ancora tutti o non potrebbe ricostruire 
Aggiungo un disco come hot spare (per abitudine i dischi successivi li acquisto sempre "con calma", così dilaziono la spesa e li ho tutti di lotti diversi, minimizzando la possibilità che se ne guastino due insieme per problemi legati alla produzione). Tanto dovrebbero ancora bastarmi i 4T disponibili (le ultime parole famose... comunque al limite me la cavo al prezzo di un restriping). Usare RAID6 sarebbe anche più sicuro, ma poi potrei avere problemi aggiungendo i dischi successivi -- preferisco rimanere sul sicuro.
[root@arwen ~]# mdadm /dev/md0 --add /dev/loop3
mdadm: added /dev/loop3
[root@arwen ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 loop3[3](S) loop2[2] loop1[0]
1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/2] [UU]
unused devices:
Effettivamente il terzo disco viene aggiunto come spare, quindi a questo punto ho un RAID5 che in realtà è un RAID1 più un hot spare.
Ora aggiungo un altro paio di dischi, tanto per arrivare ai canonici 5 ed espando il RAID:
[root@arwen ~]# mdadm /dev/md0 --add /dev/loop4
mdadm: added /dev/loop4
[root@arwen ~]# mdadm /dev/md0 --add /dev/loop5
mdadm: added /dev/loop5
[root@arwen ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 loop5[5](S) loop4[4](S) loop3[3](S) loop2[2] loop1[0]
1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/2] [UU]
unused devices:
[root@arwen ~]# umount /media/floppy
[root@arwen ~]# mdadm --grow /dev/md0 --raid-devices=5
mdadm: Need to backup 2048K of critical section..
[root@arwen ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 loop5[5] loop4[4] loop3[3] loop2[2] loop1[0]
1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [5/5] [UUUUU]
[>....................] reshape = 4.4% (47104/1047552) finish=0.3min speed=45056K/sec
unused devices:
Da notare che durante il restripe viene effettuato il backup di un paio di mega di dati. Dovrò verificare se si tratta di una dimensione fissa o se varia con la dimensione del RAID...
Ridimensiono il filesystem:
[root@arwen ~]# resize2fs /dev/md0 resize2fs 1.42.5 (29-Jul-2012) resize2fs: Dispositivo o risorsa occupata durante l'apertura di /dev/md0 Impossibile trovare un valido superblocco per il filesystem.
OPS! Chell'è? No way. Vediamo se con un bel reboot si sistema... Dopo il reboot:
[root@arwen ~]# for T in `seq 1 6`; do losetup /dev/loop$T /home/test$T.dat; done [root@arwen ~]# mdadm --assemble /dev/md0 /dev/loop[12345] mdadm: /dev/md0 has been started with 5 drives. [root@arwen ~]# e2fsck /dev/md0 e2fsck 1.42.5 (29-Jul-2012) /dev/md0 non è stato smontato in maniera corretta, controllo forzato. Passo 1: Controllo di inode, blocco(i) e dimensioni Passo 2: Analisi della struttura delle directory Passo 3: Controllo della connettività di directory Pass 4: Controllo del numero dei riferimenti Pass 5: Checking gruppo summary information /dev/md0: 12/65536 files (0.0% non-contiguous), 37244/261888 blocks [root@arwen ~]# resize2fs /dev/md0 resize2fs 1.42.5 (29-Jul-2012) Resizing the filesystem on /dev/md0 to 1047552 (4k) blocks. The filesystem on /dev/md0 is now 1047552 blocks long. [root@arwen ~]# mount /dev/md0 /media/floppy [root@arwen ~]# md5sum /media/floppy/testfile.dat b86cbca40ec49f37aadfc4e3f94d8a15 /media/floppy/testfile.dat
Fiu.... Pare proprio che tutto sia OK... Se me lo avesse fatto sul RAID coi dati buoni mi sarebbe venuto un coccolone...
Ora posso distruggere il tutto...
[root@arwen ~]# mdadm --stop /dev/md0 [root@arwen ~]# losetup -D [root@arwen ~]rm -f /home/test[123456].dat
Se dovesse tornare a dire che è "busy", con un riavvio (dopo essersi accertati che che sia tutto smontato) si risolve. Certo che mi piacerebbe capire che cosa lo tiene occupato...





Commenti
Prestazioni 7k4000: RAID5 con solo 2 dischi
Finalmente ho iniziato a provare il RAID effettivo con i primi due dischi da 4T.
Intanto, la ricostruzione iniziale richiede circa 500' (circa 8 ore, in idle)... Temevo peggio.
Poi, trasferire un file (un'immagine iso da 4G, quindi trasferimento lineare) dall'SSD interno al RAID mi ha dato un transfer rate di più di 140M/s sustained (a rebuild in corso! ma comunque influenzato anche dal caching grazie ai 16G di RAM...).
Un test sicuramente più serio è quello da bonnie++ :
[root@arwen ~]# bonnie++ -d /mnt/IntRAID/t/ -r 16384 -u 500 -g 500 Using uid:500, gid:500. Writing a byte at a time...done Writing intelligently...done Rewriting...done Reading a byte at a time...done Reading intelligently...done start 'em...done...done...done...done...done... Create files in sequential order...done. Stat files in sequential order...done. Delete files in sequential order...done. Create files in random order...done. Stat files in random order...done. Delete files in random order...done. Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP arwen.csshl.org 32G 1907 89 126663 7 59503 5 4071 87 176824 7 361.8 24 Latency 4400us 22742us 242ms 5704us 161ms 120ms Version 1.96 ------Sequential Create------ --------Random Create-------- arwen.csshl.org -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 6811 15 +++++ +++ 13588 23 7376 13 +++++ +++ 12491 26 Latency 75767us 88us 112us 190us 26us 211us 1.96,1.96,arwen.csshl.org,1,1349529619,32G,,1907,89,126663,7,59503,5,4071,87,176824,7,361.8,24,16,,,,,6811,15,+++++,+++,13588,23,7376,13,+++++,+++,12491,26,4400us,22742us,242ms,5704us,161ms,120ms,75767us,88us,112us,190us,26us,211usQuindi, per una scrittura a blocchi, un bel 126MB/s sustained usando il 7% della CPU... Dovrò ricordarmi di verificare l'uso della CPU quando avrò almeno 3 dischi in RAID5 (ora è praticamente un RAID1).
Da RAID1 a RAID5
Finalmente (dopo essermi beccato anche una truffa da un venditore online: non pagate mai con ricarica Postamat e sentitevi liberi di "pensare male" di chi ve lo chiede!) è arrivato il terzo disco da 4TB. Dopo un bel check offline con SMART, oggi lo metto online:
root@arwen:~# parted /dev/sdc GNU Parted 2.3 Viene usato /dev/sdc Benvenuti in GNU Parted. Digitare "help" per l'elenco dei comandi. (parted) print Modello: ATA Hitachi HDS72404 (scsi) Disco /dev/sdc: 4001GB Dimensione del settore (logica/fisica): 512B/4096B Tabella delle partizioni: gpt Numero Inizio Fine Dimensione File system Nome Flag 1 1049kB 4001GB 4001GB (parted) quit root@arwen:~# mdadm /dev/md0 --add /dev/sdc1 mdadm: added /dev/sdc1 root@arwen:~# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] md0 : active raid5 sdc1[3](S) sdb1[0] sdd1[2] 3906885120 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/2] [UU] unused devices: root@arwen:~# mdadm --grow /dev/md0 --raid-devices=3 mdadm: Need to backup 1024K of critical section.. root@arwen:~# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] md0 : active raid5 sdc1[3] sdb1[0] sdd1[2] 3906885120 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] [>....................] reshape = 0.0% (202240/3906885120) finish=1941.3min speed=33536K/sec unused devices:Quindi:
Seguirà (terminato il reshape...) un ulteriore test con Bonnie++ per vedere quanto il RAID5 impatti le prestazioni rispetto al RAID1.
Più veloce del previsto
La ricostruzione è terminata in meno di 24 ore (la stima iniziale era "un tantino" pessimista), e come promesso ecco i risultati di una nuova esecuzione di Bonnie++ :
Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP arwen 32G 1800 91 184701 25 96815 22 3867 90 349554 36 340.0 27 Latency 8965us 51577us 210ms 35396us 104ms 85858us Version 1.96 ------Sequential Create------ --------Random Create-------- arwen -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 5759 12 +++++ +++ 10805 22 7352 16 +++++ +++ 12787 27 Latency 522us 187us 309ms 599us 2515us 122us 1.96,1.96,arwen,1,1365095366,32G,,1800,91,184701,25,96815,22,3867,90,349554,36,340.0,27,16,,,,,5759,12,+++++,+++,10805,22,7352,16,+++++,+++,12787,27,8965us,51577us,210ms,35396us,104ms,85858us,522us,187us,309ms,599us,2515us,122usSi può facilmente notare come sia leggermente più lento e più pesante per I/O singoli, mentre per scritture sequenziali a blocchi è leggermente più veloce (ma l'uso della CPU passa da un misero 7% al 25%). In lettura il collo di bottiglia è la CPU.