Procurando por comparações de disco i / o para um servidor MySQL dedicado

2

Contratamos um consultor para nos ajudar a aumentar a capacidade do nosso cluster MySQL, e a primeira coisa (quase que apenas) que ele fez foi medir a velocidade de i / o do disco de nossos servidores.

Estou interessado em uma comparação de disco i / o em sistemas semelhantes ao que temos:

  • Nossos servidores MySQL são servidores virtuais em execução no VMWare ESX 3.5 de 32 bits com uma SAN SCSI (Raid 5), e os próprios servidores virtuais estão executando o Debian Etch e o MySQL versão 5.0.32

A execução dos seguintes comandos na caixa do MySQL fornece esses resultados para mim (que o consultor descreveu como "terrivelmente lento":

time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 71.3347 seconds, 14.7 MB/s
real    1m13.596s
user    0m0.052s
sys 0m56.932s

time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 21.8202 seconds, 48.1 MB/s
real    0m21.902s
user    0m0.012s  
sys 0m7.948s

Estes resultados são realmente "terrivelmente lentos"?

Eu estaria interessado em comparar os resultados que outras pessoas obtêm desses dois comandos em suas caixas dedicadas do MySQL - especialmente se for uma máquina virtual de 32 bits.

    
por Brent 09.07.2009 / 18:55

6 respostas

3

Algo para estar ciente é que seu comando dd não estará ignorando o cache do sistema de arquivos do sistema operacional. Isso significa que você obterá resultados variados dependendo do que estiver acontecendo, e você notará uma variação significativa de desempenho à medida que aumenta o tamanho da saída (e, portanto, exaure seu cache fs)

Adicione o "oflag = direct" para ignorar o cache do sistema de arquivos no arquivo de saída, por exemplo,

time dd if=/dev/zero of=OUT.tmp bs=1M count=1000 oflag=direct

Você pode ignorar o cache do sistema de arquivos para leitura usando iflag = direct

Além disso, seu desempenho irá variar muito com o tamanho do bloco. Enquanto o 1M é uma troca muito boa para testar gravações sequenciais, a menos que seu aplicativo esteja escrevendo blocos 1M, ele não representará seu desempenho real.

Como um ponto geral, esses números de taxa de transferência são bastante péssimos - uma única unidade sata (como as unidades Seagate ES.2) pode atingir uma gravação sequencial de 105 MB / s no início da unidade e manterá ~ 60MB / sec durante todo o percurso.

Finalmente, "melhores práticas" de banco de dados geral dizem para evitar RAID5 / 6 como um sistema subjacente para um banco de dados, devido à sobrecarga relativamente alta causada por paridade escreve (não o próprio cálculo de paridade real, que é bastante barato em hardware, mas o efeito de ter que fazer leituras e gravações extras ao escrever nova paridade).

    
por 17.07.2009 / 05:46
1

Aqui estão os resultados do meu servidor mysql. É uma máquina de 64 bits, não virtual, então não tenho certeza de quanto uso realmente é, mas há uma diferença considerável.

time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 5.72139 s, 183 MB/s
0.00s user 1.55s system 27% cpu 5.725 total

time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.432328 s, 2.4 GB/s
0.00s user 0.45s system 103% cpu 0.436 total
    
por 09.07.2009 / 19:24
1

na maioria dos casos, você também deve comparar o io aleatório [por exemplo, com bonnie ++ ] não apenas leitura / gravação linear. ou talvez seja um coletor de big data que leva logs e armazena em uma grande tabela não indexada?

resultados para dd 'benchmark'

szcapp1:/mnt/big/tmp# time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.26186 s, 246 MB/s

real    0m4.563s
user    0m0.001s
sys     0m2.255s
szcapp1:/mnt/big/tmp# time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.457162 s, 2.3 GB/s

real    0m0.459s
user    0m0.000s
sys     0m0.459s
szcapp1:/mnt/big/tmp#

64bit linux no dell poweredge 2950, perc6 raid 10 em discos sata de 500GB para desktop de 5x. Ram de 16GB, 2x quad core 2,66GHz. mas ei! isso não faz sentido - esses dados se encaixam em 1/4 na memória cache do controle RAID e em repouso - na memória do sistema.

seus resultados são lentos de fato. resultados da execução do vm no linux acima de [32bit linux guest sob o servidor vmware 2.0]:

vfeed0:/tmp# time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 15.996 s, 65.6 MB/s

real    0m16.043s
user    0m0.016s
sys     0m13.117s
vfeed0:/tmp# time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.49413 s, 2.1 GB/s

real    0m0.505s
user    0m0.000s
sys     0m0.500s
vfeed0:/tmp#

lembre-se de que o desempenho de leitura é falso - é lido no cache - se não for do cache de guest e, em seguida, importuno do cache do host vmware.

    
por 09.07.2009 / 19:26
1

Além do que Daniel Lawson observou sobre os resultados em GB / s em cache.

Se o dd não suportar iflag/oflag , você poderá liberar manualmente o cache de disco entre as execuções com o comando:

sync; echo 3 > /proc/sys/vm/drop_caches

Ou simplesmente usar um conjunto de dados duas vezes maior que sua RAM garantirá que os dados nunca tenham uma chance de serem armazenados em cache entre as execuções.

Quanto ao dd test do seu consultor - é um bom ponto de partida, mas não um teste conclusivo. Está medindo a E / S seqüencial. São os blocos de leitura e escrita que ficam imediatamente próximos um do outro no disco físico. Infelizmente, os bancos de dados lidam muito raramente com E / S sequencial. Os registros são gravados em horários diferentes e geralmente não são recuperados ao longo do tempo, na ordem em que foram gravados.

Com isso em mente, os dois fatores mais importantes que você precisa medir são a taxa de transferência e a latência de E / S aleatória. Estes terão o maior impacto sobre como o MySQL se comporta. Para medir isso, sugiro usar o utilitário bonnie++ . Ele tem testes predefinidos para avaliar todos os itens acima e é muito mais configurável se você quiser testar aspectos específicos.

Você também pode usar o MySQL super-smack para medir o desempenho repetido de consultas SQL individuais.

    
por 17.07.2009 / 09:04
0

Um pouco distante da sua pergunta original; mas a resposta do fornecedor SAN ao "RAID 5 é lento" é converter para RAID 1 ou RAID 10. Considere também o alinhamento do VMFS ( PDF pode estar afetando gravemente o desempenho.

    
por 19.08.2009 / 06:41
0

Quando meu velho Dell Latitude D520 (80Go; 5400RPM) desafia o seu servidor MySQL, você sabe que há um problema em algum lugar ^^:

$ time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 32.5178 s, 32.2 MB/s
real    0m32.662s
user    0m0.008s
sys 0m2.716s

$ time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 29.8311 s, 35.2 MB/s
real    0m29.892s
user    0m0.004s
sys 0m2.056s

Você deve primeiro dar uma olhada na tensão que esses dois testes colocam na carga de E / S dos nós do ESX.

Em seguida, faça um teste bonnie ++ acoplado a iostat e mpstat em execução em shells paralelos (ahoy screen!) nesses nós e na SAN para descobrir onde está o gargalo. Você certamente encontrará grandes quantidades de iowaits em algum lugar, essa será a parte em que se concentrar.

    
por 11.02.2011 / 18:17