Problema na interpretação da medida de tps do iostat

3

Prelúdio: Eu despejei um banco de dados de 5,2 GB usando o comando mysqldump. Eu fiz isso em um servidor virtual pouco potente com apenas 512 MB de memória. Demorou cerca de uma hora. Agora estou recarregando esse banco de dados na minha máquina desktop que tem uma CPU dual core e 2 GB de memória. O recarregamento está em sua 9ª hora e eu não sei se está perto de terminar. Eu recarreguei este banco de dados na mesma máquina há cerca de um ano e levou apenas duas horas. A diferença entre então e agora é que eu substituí meu disco rígido ATA único por dois discos SATA no modo raid1. Eu sei que o raid1 vai escrever mais devagar (em teoria) mas definitivamente não é 4.5x mais lento! Então eu comecei o iostat e fiquei mais confuso.

$ sudo iostat 
Linux 2.6.30-2-amd64 (lukahn)  12/12/2009  _x86_64_ (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.13    0.00    1.94   27.96    0.00   62.97

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda             144.02       198.41     11139.44    9322418  523399320
sdb             143.78       165.59     11137.39    7780516  523303000
hda               0.01         0.05         0.00       2492          0
md0               0.66         6.44         0.71     302538      33496
md1               7.32        67.02         7.51    3148938     352960
md2               6.08       240.02        18.95   11277610     890584
md3            1389.80        46.85     11106.55    2201410  521853640
md4               0.41         3.03         0.21     142322       9824

sda e sdb são as unidades SATA reais que fazem o backup dos dispositivos md, como você pode ver em / proc / mdstat:

$ cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md4 : active raid0 sda6[0] sdb6[1]
      48821248 blocks 64k chunks

md3 : active raid1 sda5[0] sdb5[1]
      48829440 blocks [2/2] [UU]

md2 : active raid1 sda4[0] sdb4[1]
      1318358080 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      48829440 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      9767424 blocks [2/2] [UU]

O arquivo .sql do qual estou recarregando está na partição / home no md2 e a partição / var está no md3. Eu suponho que os blocos escritos em md3 são muito mais altos que os blocos lidos em md2 devido aos índices de regeneração do MySql. No entanto, a grande questão que tenho é como a medida tps para md3 pode ser muito maior que a medida tps para sda e sdb?

A opção -m para iostat mostra a mesma quantidade de dados (5,55 MB / s) sendo gravados no disco para md3 e sda / sdb:

$ sudo iostat -m
Linux 2.6.30-2-amd64 (lukahn)   12/12/2009  _x86_64_    (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.39    0.00    2.00   28.16    0.00   62.44

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda             145.16         0.10         5.55       4976     267768
sdb             144.90         0.09         5.55       4143     267716
hda               0.01         0.00         0.00          1          0
md0               0.66         0.00         0.00        154         16
md1               7.18         0.03         0.00       1580        172
md2               6.19         0.13         0.01       6153        443
md3            1418.41         0.02         5.53       1146     266994
md4               0.40         0.00         0.00         69          5

A página man do iostat diz:

tps

Indicate the number of transfers per second that were issued to the device. A transfer is an I/O request to the device. Multiple logical requests can be combined into a single I/O request to the device. A transfer is of indeterminate size.

Eu não espero que eles sejam exatamente iguais, mas certamente não são 864% diferentes! Isso é um sinal de um gargalo devido à minha configuração incorreta do dispositivo md ou estou apenas preocupado com nada?

    
por dvogel 12.12.2009 / 18:06

3 respostas

9

Essa é uma invocação única do iostat, que não fornece dados significativos para valores "por segundo", somente os contadores são úteis - ela não pode calcular a mudança por segundo a partir de um valor único, precisa saber dois valores e tempo entre eles. Para ver valores reais, tente algo como:

iostat -d 1 2

A segunda saída será valores reais.

A partir da página do iostat:

The first report generated by the iostat command provides statistics concerning the time since the system was booted. Each subsequent report covers the time since the previous report.

    
por 07.07.2010 / 18:09
2

Como as taxas de transferência são as mesmas, a saída que você fornece diz que a camada MD armazena as transações em cache e as grava no disco físico em partes maiores.

A lentidão que você está vendo com o recarregamento do banco de dados é provavelmente devida a índices, como você disse. Você pode evitar isso apenas por não ter os índices atualizados conforme você carrega os dados e, em seguida, apenas recriar os índices no final.

    
por 12.12.2009 / 21:05
0

A taxa de transação que um determinado disco suportará é uma função do tempo de busca da faixa. Para unidades SATA, isso geralmente é de cerca de 5 a 8ms, portanto, esperaria algo em torno de 125 a 200 transações por segundo.

Você está vendo ~ 145 tps em cada uma das unidades, o que parece bastante razoável.

    
por 26.01.2010 / 04:19