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 Smile

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

Opzioni visualizzazione commenti

Seleziona il tuo modo preferito per visualizzare i commenti e premi "Salva impostazioni" per attivare i cambiamenti.

Prestazioni 7k4000: RAID5 con solo 2 dischi

immagine di NdK

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,211us

Quindi, 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).

Il tuo voto: Nessuna

Da RAID1 a RAID5

immagine di NdK

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:

  • La dimensione della critical section non è costante (con l'aggiunta di un solo disco è di 1M -- forse è 1M per ogni disco che viene aggiunto?)
  • il tempo previsto per convertire un RAID1 da 4T in RAID5 da 8T è di circa 32 ore! Si tratta di una stima iniziale che già mentre scrivo, si è ridotta considerevolmente a circa 26 ore -- no, non sono così lento a scrivere Smile -- ed occupa un processore al 44%.

Seguirà (terminato il reshape...) un ulteriore test con Bonnie++ per vedere quanto il RAID5 impatti le prestazioni rispetto al RAID1.

Il tuo voto: Nessuna

Più veloce del previsto

immagine di NdK

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,122us

Si 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.

Il tuo voto: Nessuna

Opzioni visualizzazione commenti

Seleziona il tuo modo preferito per visualizzare i commenti e premi "Salva impostazioni" per attivare i cambiamenti.
Realizzato con Drupal, un sistema open source per la gestione dei contenuti