Come posso migliorare le prestazioni del disco del mio server


10

Ho un microserver HP con Ubuntu 10.04 LTS. È un server a basso consumo con 5 alloggiamenti per unità interne. Lo uso per eseguire il backup dei miei server remoti, VPS e laptop locali sulla rete. Voglio ottenere le migliori prestazioni dai dischi, ma non so se è configurato in modo ottimale, quindi sto cercando qualche consiglio.

Il mio server esegue rsnapshot più volte al giorno per eseguire il backup degli host remoti. La parte di backup incrementale effettiva richiede pochissimo tempo. Il tempo significativo è trascorso facendo cose come: -

/bin/cp -al /srv/rsnapshot/hourly.0 /srv/rsnapshot/hourly.1

Ci vogliono circa 2 ore. Mi rendo conto che ci sono un sacco di minuscoli file lì dentro.

$ sudo du -hs hourly.1
659G    hourly.1

Anche quando rsnapshot elimina un vecchio backup ciò può richiedere molto tempo: -

/bin/rm -rf /srv/rsnapshot/daily.6/

Che dura circa mezz'ora.

Le mie domande sono le seguenti, la configurazione del server e alcune statistiche IO sono riportate di seguito. Posso ovviamente fornire ulteriori informazioni di debug se necessario: -

Come posso identificare dove si trovano i colli di bottiglia?

Sto raggiungendo i limiti di ciò che è capace (IO saggio) con questa scatola?

Ci sono delle modifiche alle prestazioni che potrei fare?

Dovrei usare un livello RAID diverso?

Avrebbe senso scambiare due dei dischi RAID interni (metà di ogni mirror) con due "altre metà dell'altro mirror" sull'array esterno?

Nota: in qualche modo non sono propenso a fare cose come compilare il mio kernel. Idealmente, mi piacerebbe attenermi a 10.04 LTS, a meno che non ci sia un po 'di magia nelle versioni successive che faccia funzionare tutto molto più velocemente.

Internamente il server ha un disco di avvio SATA 1x160GB e dischi 4x2TB: -

Disk /dev/sde: 160.0 GB, 160041885696 bytes
Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdh: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdi: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdg: 2000.4 GB, 2000398934016 bytes

I quattro dischi interni da 2 TB sono in un'installazione software MD RAID10: -

md0 : active raid10 sdg1[3] sdh1[0] sdi1[2] sdf1[1]
      3907023872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

Inoltre ho un contenitore di unità EDGE10 esterno che è collegato tramite una scheda eSATA PCI-E e contiene altre quattro unità da 500 GB: -

Disk /dev/sda: 500.1 GB, 500107862016 bytes
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
Disk /dev/sdc: 500.1 GB, 500107862016 bytes
Disk /dev/sdd: 500.1 GB, 500107862016 bytes

Questo è anche configurato come un array MD RAID10

md1 : active raid10 sdb1[1] sda1[0] sdd1[3] sdc1[2]
      976767872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

md0 e md1 sono combinati per creare un grande LVM. Nota: di recente ho aggiunto l'array esterno, quindi è praticamente vuoto, non credo che ci siano blocchi in questo momento.

Questo è presentato come volume LVM: -

--- Logical volume ---
LV Name                /dev/data/data
VG Name                data
LV UUID                amZCgU-sQLi-R363-dUFx-Bcdf-iwlt-ZNnDp8
LV Write Access        read/write
LV Status              available
# open                 1
LV Size                4.54 TiB
Current LE             1190134
Segments               2
Allocation             inherit
Read ahead sectors     auto
- currently set to     512
Block device           251:0

Che è formattato come EXT4 e montato come / srv: -

/dev/mapper/data-data on /srv type ext4 (rw)

C'è molto spazio libero.

/dev/mapper/data-data
                      4.5T  2.2T  2.1T  51% /srv

Altre informazioni che potrebbero essere utili: -

$ uname -a
Linux ubuntuserver 2.6.32-32-server #62-Ubuntu SMP Wed Apr 20 22:07:43 UTC 2011 x86_64 GNU/Linux

.

00:11.0 SATA controller: ATI Technologies Inc SB700/SB800 SATA Controller [AHCI mode] (rev 40)
02:00.0 RAID bus controller: Silicon Image, Inc. SiI 3132 Serial ATA Raid II Controller (rev 01)

Quando eseguo il comando cp durante rsnapshot vedo quanto segue in iostat: -

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.55    0.00    5.47   66.14    0.00   27.85

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.10    0.00     0.80     0.00     8.00     0.00    0.00   0.00   0.00
sdf               0.00   407.50    0.00   66.80     0.00  3790.40    56.74   124.86 1524.88  13.55  90.50
sdh               0.00   406.90    0.00   66.90     0.00  3790.40    56.66    92.89 1230.52  13.21  88.40
sdi               0.00   407.80    5.50   70.20    44.00  3824.00    51.10   113.83 1333.84  12.34  93.40
sdg               0.00   406.80    6.10   71.60    48.80  3827.20    49.88    64.32  787.68  11.69  90.80
md0               0.00     0.00   11.50 1484.60    92.00 11876.80     8.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00   11.50 1484.70    92.00 11877.60     8.00  5331.18  471.91   0.63  94.70
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Quindi in pratica un sacco di scritture, molti IO aspettano.

Quindi in questo momento la scatola è inattiva, ho sospeso tutti i lavori.

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdf               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdh               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdi               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdg               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Sembra peachy!

$ sudo hdparm -T -t /dev/sd[a-i]

/dev/sda:
 Timing cached reads:   2532 MB in  2.00 seconds = 1265.95 MB/sec
 Timing buffered disk reads:  270 MB in  3.02 seconds =  89.53 MB/sec

/dev/sdb:
 Timing cached reads:   2516 MB in  2.00 seconds = 1258.07 MB/sec
 Timing buffered disk reads:  264 MB in  3.02 seconds =  87.37 MB/sec

/dev/sdc:
 Timing cached reads:   2442 MB in  2.00 seconds = 1220.80 MB/sec
 Timing buffered disk reads:  272 MB in  3.00 seconds =  90.60 MB/sec

/dev/sdd:
 Timing cached reads:   2520 MB in  2.00 seconds = 1259.64 MB/sec
 Timing buffered disk reads:  272 MB in  3.02 seconds =  90.07 MB/sec

/dev/sde:
 Timing cached reads:   2524 MB in  2.00 seconds = 1261.48 MB/sec
 Timing buffered disk reads:  306 MB in  3.01 seconds = 101.56 MB/sec

/dev/sdf:
 Timing cached reads:   2366 MB in  2.00 seconds = 1183.28 MB/sec
 Timing buffered disk reads:  388 MB in  3.01 seconds = 128.88 MB/sec

/dev/sdg:
 Timing cached reads:   2536 MB in  2.00 seconds = 1267.52 MB/sec
 Timing buffered disk reads:  400 MB in  3.00 seconds = 133.12 MB/sec

/dev/sdh:
 Timing cached reads:   2538 MB in  2.00 seconds = 1269.08 MB/sec
 Timing buffered disk reads:  426 MB in  3.00 seconds = 141.90 MB/sec

/dev/sdi:
 Timing cached reads:   2538 MB in  2.00 seconds = 1268.57 MB/sec
 Timing buffered disk reads:  402 MB in  3.01 seconds = 133.69 MB/sec

Hmm. Odio suddividere le strutture del disco su hardware diverso perché rende le cose così difficili da risolvere. Normalmente suggerirei di eseguire qualcosa di simile bonnie++su ciascun array separatamente in modo da avere benchmark di velocità di base per loro. Non ho molta esperienza con LVM, quindi non sono sicuro che il loro disaccoppiamento sia un'opzione ora.
Oli

L'array esterno non è davvero un problema. Non ci sono blocchi. Sono le prestazioni del disco interno che spero di ottenere audio.
popey,

Risposte:


3

Sfortunatamente la cache stripe si applica solo a RAID5 e 6 - non esiste un equivalente per RAID 0/1/10.

Le prestazioni dei tuoi singoli dischi (come da hdparm) sembrano buone - stanno tutti andando come previsto per i dischi di quella classe.

I miei suggerimenti:

  1. Verificare che AHCI sia abilitato nel BIOS e che le unità installate internamente non utilizzino la modalità IDE legacy. È disponibile un BIOS hackerato per il MicroServer che abilita anche AHCI anche per la porta eSATA (consultare questo link per ulteriori informazioni) - potrebbe valere la pena indagare per le unità nel contenitore esterno, anche se saranno comunque limitate dal fatto di essere dietro un moltiplicatore di porte.
  2. Abilita NCQ per tutte le unità e vedi se questo fa la differenza (potrebbe, potrebbe non farlo).
  3. Assicurati che le impostazioni del filesystem siano ottimizzate (montaggio noatime, nodiratime). Potresti anche disabilitare le barriere di scrittura , ma potrebbe essere troppo rischioso.
  4. Controlla se vedi qualche vantaggio dal cambio dello scheduler I / O (noop può aiutarti qui).
  5. Regola il buffer read-ahead per i dispositivi md e LVM: blockdev --setra <size> /dev/md1ad esempio (dove <size>sono i settori a 512 byte). Questo aiuterà solo a leggere.

Altre due cose che possono influire sulle prestazioni sono l'allineamento delle partizioni e i parametri di creazione del file system (falcata, ecc.) Ma, poiché si utilizzano strumenti moderni, ciò non dovrebbe costituire un problema.


Aggiunti i tempi di hdparm del disco e modificati fstab (e rimontati) per usare noatime e nodiratime. Lo lascerò 24 ore in quel modo.
popey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.