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)