Por que o tempo gasto para buscar resultados de uma consulta por 10.000 vezes a partir de um RDS é tão desigual? (experimentar)

3

tl; dr: Por que o tempo gasto para buscar resultados de uma instrução SELECT por 10.000 vezes de um RDS quando solicitado de um EC2 é tão desigual?

Atualizou a pergunta com resultados de servidores RDS pequenos e médios

Enquanto fazia experimentos com a AWS para verificar o tempo gasto para buscar o resultado de uma consulta SQL, obtive o seguinte resultado muito desigual:

Eu escrevi um código PHP para relatar o tempo gasto para buscar o reqult de uma consulta SELECT para n vezes do servidor.

while($flag<n)
    {
       $t=microtime(true);
       $result=$con->query($q);
       $t=microtime(true)-$t;
       $total+=$t;
       $flag++;
    }

Meio Ambiente:

  • Todas as transações foram feitas dentro de um VPN privado na AWS
  • Todos os servidores estão em zonas diferentes
  • A configuração do MySQL em cada servidor é: MySQL no EC2: versão = 5.6, no RDS: 5.5, query_cache_size = 16777206, query_cache_state = ON.
  • Banco de dados Um grande banco de dados ~ = 5 GB, a tabela consultada tinha ~ = 20000 linhas.

Servidores:

  • EC2 A, Zona de disponibilidade: us-east-1e, Tipo: t2.micro.
  • EC2 B, Zona de disponibilidade: us-east-1b, Tipo: t2.micro.
  • Zona de disponibilidade do RDS: us-east-1c, Tipo: db.t2.micro, db.t2.small (atualizado), db.t2.medium (atualizado)

Resultados:

Tempo gasto por 10.000 ciclos de execução de uma consulta SELECT:

  • Solicitando servidor B, servidor de banco de dados B

Os resultados de 5 ensaios foram: 20, 21, 20, 20, 21 (todos em segundos)

  • Solicitando o servidor A, servidor de banco de dados B

Os resultados de 5 ensaios foram: 33, 33, 33, 33, 3 (todos em segundos)

  • Solicitando o servidor A, servidor de banco de dados RDS (micro)

Os resultados de 11 ensaios foram: 272, 709, 49, 48, 711, 593, 47, 316, 153, 47, 636 (todos em segundos)

  • Solicitando o servidor A, servidor de banco de dados RDS (pequeno)

Os resultados de 5 ensaios foram: 53, 54, 53, 158, 698 (todos em segundos)

  • Solicitando o servidor A, Servidor de banco de dados RDS (médio)

Os resultados de 5 ensaios foram: 96, 123, 579, 252 (todos em segundos)

Por que o tempo gasto pelo RDS no teste de 10.000 loops da instrução SELECT é tão desigual? E por que é tão alto quanto os servidores EC2?

[Eu não acho que é devido à rede, porque quando eu fiz o experimento com loops menores (1000 loops) as leituras para EC2 - > RDS foram 4, 5, 5, 5, 4.]

Quando eu registrei a hora de cada solicitação de busca, notei o seguinte:

  • Para o caso em que foram necessários 153 segundos para 10.000 loops no RDS:

Tempo médio obtido por consulta: 0,015419

Não de consultas Levou mais que o tempo médio de 10000: 1644

Tempo total gasto pelas consultas que levaram mais que o tempo médio para conclusão: 119,364 (78% do tempo total)

  • Para o caso em que foram necessários 636 segundos para 10.000 loops no RDS:

Tempo médio obtido por consulta: 0,063605

Não de consultas Levou mais que o tempo médio de 10000: 8629

Tempo total gasto pelas consultas que levaram mais que o tempo médio para conclusão: 628,6426 (98,8% do tempo total)

Editar1:

Eu registrei o tempo para cada solicitação de busca no ciclo de 10.000 req Percebi que, após alguns pedidos, o tempo para cada req aumenta para ~ 0,07 (de ~ 0,003) segundos. Mas isso aumenta depois de um número aleatório de solicitações. Como, por vezes, após ~ 8000 pedidos e, por vezes, após ~ 3000 req. Qual seria a razão? Além disso, quando são necessários aproximadamente 45 segundos para 10.000 solicitações, a utilização da CPU no RDS é de aproximadamente 5%. Quando o tempo gasto é de cerca de 100 segundos, a CPU fica em torno de 10-15%.

Editar2:

Eu atualizei o servidor RDS de t2.micro para t2.small e posterior para t2.medium. Mais uma vez o desempenho foi desigual:

  • Solicitando o servidor A, servidor de banco de dados RDS (pequeno)

Os resultados de 5 ensaios foram: 53, 54, 53, 158, 698 (todos em segundos)

  • Solicitando o servidor A, Servidor de banco de dados RDS (médio)

Os resultados de 5 ensaios foram: 96, 123, 579, 252 (todos em segundos)

Editar3:

Troquei o RDS para outra zona. Agora as leituras parecem consistentes. Pode ser que o problema seja o roubo da CPU por algum vizinho barulhento.

  • Solicitando o servidor A, RDS do servidor de banco de dados (pequeno, em uma zona diferente)

Os resultados de 5 ensaios foram: 156, 151, 151, 151, 151, 302 (todos em segundos)

    
por Sumit Sinha 15.12.2014 / 12:16

1 resposta

6

Percebi que você está usando a instância db.micro . Assim como no EC2, as microinstâncias são projetadas para serem econômicas, mas com um custo de desempenho. Dito isso, você obterá um muito pior desempenho ao carregar esses tipos de servidores em relação às instâncias normais porque o tempo de CPU é dado à instância "last" em comparação com outras instâncias que compartilham o mesmo hardware. / p>

Para provar o ponto, execute seus testes novamente em uma instância db.medium e você achará isso muito mais consistente.

    
por 15.12.2014 / 14:11