Como eu melhoro o desempenho do meu servidor?

10

Eu tenho um HP Microserver executando o Ubuntu 10.04 LTS. É um servidor de baixo consumo de energia com 5 baias internas. Eu uso para fazer backup de meus servidores remotos, VPSs e laptops locais pela rede. Eu quero obter o melhor desempenho dos discos, mas não sei se é a configuração ideal, então estou procurando alguns conselhos.

Meu servidor executa 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. Eu percebo que há um bazillion minúsculos arquivos lá dentro.

$ 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, configuração do servidor e algumas estatísticas de IO são detalhadas abaixo. É claro que posso fornecer mais informações de depuração, se necessário: -

Como posso identificar onde estão os afunilamentos?

Estou atingindo os limites do que é capaz (IO sábio) com essa caixa?

Há algum ajuste de desempenho que eu possa fazer?

Devo usar um nível de RAID diferente?

Faz sentido trocar dois dos discos RAID internos (metade de cada espelho) por duas 'outras metades do outro espelho' no array externo?

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

Internamente, o servidor possui 1 x 160 GB de disco de inicialização SATA e discos de 4 x 2 TB: -

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 do 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, tenho um gabinete de unidade EDGE10 externo que é conectado por meio de 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

Isto também é configurado como um array RAID10 MD

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 fazer um grande LVM. Nota: Eu só recentemente adicionei o array externo, então está praticamente em branco, eu não acho que existam blocos nele agora.

Isto é 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 fazer 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 IO espera.

Então agora a caixa está ociosa, eu 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
    
por popey 16.06.2011 / 12:38

1 resposta

3

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

O desempenho de suas unidades individuais (de acordo com hdparm ) parece bom - todas elas 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 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. Habilite o NCQ para todas as unidades e veja se isso faz diferença (pode, talvez 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 ao 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/md1 por exemplo (onde <size> é setores de 512 bytes). Isso só ajudará nas leituras.

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

    
por mjturner 16.06.2011 / 15:09