====== Multipath I/O ======
In Linux le funzionalità di [[wp>Multipath_I/O|multipath I/O]] sono state rimosse dai singoli driver delle schede [[wp>Fibre_Channel|Fibre Channel]], dove erano stati tradizionalmente implementati dai vari vendor. Adesso il multipath viene gestito dal modulo kernel **''dm_multipath''**, che funziona tramite [[wp>Device_mapper|device mapper]].
Ad esempio - per le schede QLogic - il parametro **''ql2xfailover''** del modulo **''qla2xxx''** è deprecato (se non del tutto rimosso, come nel kernel 2.6.30).
===== Installazione =====
Oltre ai moduli kernel dei controller HBA e al modulo ''dm_multipath'', è necessario installare i tool userspace contenuti nel pacchetto Debian **multipath-tools**.
Dopo aver caricato il modulo **''qla2xxx''** risulta disponibile un device SCSI per ogni path. Ad esempio su un sistema con due controller HBA QLogic, ciascuno dei quali connesso con due patch, vengono rilevati quattro device SCSI:
[1009446.698632] sd 0:0:0:1: [sda] 209715200 512-byte hardware sectors: (107 GB/100 GiB)
[1009446.698871] sd 0:0:1:1: [sdb] 209715200 512-byte hardware sectors: (107 GB/100 GiB)
[1009446.724772] sd 1:0:0:1: [sdc] 209715200 512-byte hardware sectors: (107 GB/100 GiB)
[1009446.725049] sd 1:0:1:1: [sdd] 209715200 512-byte hardware sectors: (107 GB/100 GiB)
All'interno di ciascun disco esiste una partizione (sda1, sdb1, sdc1, sdd1) che occupa l'intero spazio disponibile.
In realtà si tratta di **un'unico volume** condiviso dalla [[wp>Storage_area_network|SAN]], raggiungibile tramite quattro path distinte. Prima di usarlo sotto Linux bisogna //aggregare// le path.
===== Assemblaggio =====
L'assemblaggio delle quattro path in un unico device (//coalescing//) viene eseguito da **''multipath(8)''**, avviato automaticamente da ''/etc/init.d/multipath-tools-boot''. Se il probing automatico dei device multipath non funziona, si possono dare indicazioni nel file di configurazione **''/etc/multipath.conf''**.
Per vedere i device assemblati e la topologia multipath:
multipath -ll
3600508b4000ce4cd0000d00000200000dm-0 HP ,HSV300
[size=100G][features=0][hwhandler=0]
\_ round-robin 0 [prio=1][active]
\_ 0:0:0:1 sda 8:0 [active][ready]
\_ round-robin 0 [prio=1][enabled]
\_ 0:0:1:1 sdb 8:16 [active][ready]
\_ round-robin 0 [prio=1][enabled]
\_ 1:0:1:1 sdd 8:48 [active][ready]
\_ round-robin 0 [prio=1][enabled]
\_ 1:0:0:1 sdc 8:32 [active][ready]
Informazioni simili sono fornite dal sottosistema device mapper, tramite **''dmsetup''**:
dmsetup --tree ls
3600508b4000ce4cd0000d00000200000-part1 (254:1)
└─3600508b4000ce4cd0000d00000200000 (254:0)
├─ (8:32)
├─ (8:48)
├─ (8:16)
└─ (8:0)
Tra parentesi abbiamo il (major:minor) number di ogni device, in particolare (8:0) corrisponde a **''/dev/sda''**, (8:16) a **''/dev/sdb''**, ecc.
Il device (partizione) da utilizzare è **''/dev/mapper/3600508b4000ce4cd0000d00000200000-part1''**, per comodità viene creato il link simbolico **''/dev/dm-1''**.
Per disassemblare tutti i device multipath non in uso:
multipath -F
===== Monitoraggio =====
Il monitoraggio viene eseguito dal demone **''multipathd''**, avviato automaticamente da ''/etc/init.d/multipath-tools''. Il file di configurazione è **''/etc/multipath.conf''**.
Esiste una modalità //command line// di ''multipathd'', basta avviarlo con lo switch **''-k''** (si esce con Ctrl-D). Dal prompt si dovrebbe poter mettere in stato di fail un path, ecc. Ma non funziona:
multipathd -k
multipathd> show paths
hcil dev dev_t pri dm_st chk_st next_check
0:0:0:1 sda 8:0 1 [undef][ready] [orphan]
0:0:1:1 sdb 8:16 1 [undef][ready] [orphan]
1:0:1:1 sdd 8:48 1 [undef][ready] [orphan]
1:0:0:1 sdc 8:32 1 [undef][ready] [orphan]
multipathd> fail path sdd
fail
===== Testing =====
Installare i pacchetti Debian:
* **parted**
* **hdparm**
* **sysstat**
Il primo contiene **''partprobe(8)''**, necessario per rileggere senza reboot la tabella delle partizioni dopo averla modificata.
Con **''hdparm(8)''** si può eseguire un semplice test di performance sul disco. Ecco i risultati sul disco Fibre Channel e sullo Smart Array SCSI:
hdparm -T /dev/dm-1
Timing cached reads: 3322 MB in 2.00 seconds = 1661.30 MB/sec
hdparm -T /dev/cciss/c0d0p7
Timing cached reads: 3302 MB in 2.00 seconds = 1651.03 MB/sec
Con **''iostat(1)''** è possibile monitorare il carico e la path usata. Ecco un esempio catturato durante la copia di svariati giga di dati:
iostat 4
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
cciss/c0d0 0.00 0.00 0.00 0 0
sda 424.50 0.00 403848.00 0 1615392
sdb 0.00 0.00 0.00 0 0
sdd 0.00 0.00 0.00 0 0
sdc 0.00 0.00 0.00 0 0
dm-0 49676.25 0.00 397412.00 0 1589648
dm-1 49675.75 0.00 397406.00 0 1589624