Como melhoro o desempenho do disco do servidor

10

Eu tenho um HP Microserver executando o Ubuntu 10.04 LTS. É um servidor de baixa potência com 5 compartimentos de unidade interna. Eu o uso para fazer backup de meus servidores remotos, VPSs e laptops locais pela rede. Quero obter o melhor desempenho dos discos, mas não sei se está configurado da melhor maneira, por isso estou procurando alguns conselhos.

Meu servidor executa o rsnapshot várias vezes ao dia para fazer backup de hosts remotos. A parte de backup incremental real leva muito pouco tempo. O tempo significativo é gasto fazendo coisas como: -

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

O que leva cerca de 2 horas. Sei que há um bazilhão de pequenos arquivos lá.

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

Além disso, quando o rsnapshot exclui um backup antigo, isso pode levar um longo tempo: -

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

O que leva cerca de meia hora.

Minhas perguntas são as seguintes, a configuração do servidor e algumas estatísticas de E / S são detalhadas abaixo. Obviamente, posso fornecer mais informações sobre depuração, se necessário: -

Como posso identificar onde estão os gargalos?

Estou atingindo os limites do que é capaz (em termos de IO) com esta caixa?

Existem ajustes de desempenho que eu poderia fazer?

Devo usar um nível RAID diferente?

Faria sentido trocar dois dos discos RAID internos (metade de cada espelho) por duas 'outras metades do outro espelho' na matriz externa?

Nota: Não estou inclinado a fazer coisas como compilar meu próprio kernel. Idealmente, eu gostaria de usar o 10.04 LTS, a menos que haja alguma mágica nas versões posteriores que faça tudo funcionar muito mais rápido.

Internamente, o servidor possui disco de inicialização 1x160GB SATA e discos 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

Os quatro discos internos de 2 TB estão em uma configuração de software MD RAID10: -

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

Além disso, eu tenho um gabinete de unidade EDGE10 externo conectado a uma placa PCI-E eSATA e contém mais quatro unidades de 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

Isso também é configurado como uma matriz 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 são combinados para criar um grande LVM. Nota: Eu adicionei apenas recentemente a matriz externa, então fica praticamente em branco, acho que não há nenhum bloco nela agora.

É apresentado como um 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

Que é formatado como EXT4 e montado como / srv: -

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

Há muito espaço livre.

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

Outras informações que podem ser úteis: -

$ 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)

Ao executar o comando cp durante o rsnapshot, vejo o seguinte no 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

Então, basicamente, muitas gravações, muita espera de E / S.

Então, agora, a caixa está ociosa, suspendi todos os trabalhos.

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

Parece 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
popey
fonte
Hmm. Eu odeio dividir estruturas de disco em diferentes hardwares porque dificulta a solução de problemas assim. Normalmente, eu sugiro executar algo parecido bonnie++em cada matriz separadamente, para que você tenha benchmarks básicos de velocidade para eles. Como não tenho muita experiência com LVM, não tenho certeza de que dissociá-los é uma opção agora.
Oli
A matriz externa realmente não é um problema. Não há blocos nele. É o desempenho do disco interno que espero obter som.
popey

Respostas:

3

Infelizmente, o cache de distribuição se aplica apenas ao RAID5 e 6 - não há equivalente para o RAID 0/1/10.

O desempenho de suas unidades individuais (como por hdparm) parece bom - todos estão funcionando conforme o esperado para as unidades dessa classe.

Minhas sugestões:

  1. Verifique se o AHCI está ativado no BIOS e se as unidades instaladas internamente não estão usando o modo IDE herdado. Há um BIOS hackeado para o MicroServer disponível que também habilita o AHCI para a porta eSATA (consulte este link para obter mais informações) - pode valer a pena investigar as unidades no gabinete externo, embora elas ainda sejam limitadas por estarem atrás de um multiplicador de portas.
  2. Ative o NCQ para todas as unidades e veja se isso faz alguma diferença (pode ou não).
  3. Verifique se as configurações do sistema de arquivos estão otimizadas (montagem noatime, nodiratime). Você também pode desativar as barreiras de gravação , mas isso pode ser muito arriscado.
  4. Verifique se você vê algum benefício em alternar o agendador de E / S (noop pode ajudar aqui).
  5. Ajuste o buffer de leitura antecipada para os dispositivos md e LVM: blockdev --setra <size> /dev/md1por exemplo (onde <size>estão os setores de 512 bytes). Isso só vai ajudar as leituras.

Duas outras coisas que podem afetar o desempenho são o alinhamento das partições e os parâmetros de criação do sistema de arquivos (passo, etc), mas como você está usando ferramentas modernas, isso não deve ser um problema.

mjturner
fonte
Adicionados os tempos do hdparm do disco e editamos o fstab (e remontado) para usar noatime e nodiratime. Vai deixar 24 horas assim.
popey