Enviando dados extremamente lentos ou RDS

1

Eu tenho os dois perfis a seguir para uma% básica deSELECT STATEMENT:

select count(*) from mturk_completion;

Aqui estão os dois perfis:

# My Local machine, using a local db
Status                Duration
starting              0.000045
checking permissions  0.000006
Opening tables        0.000015
init                  0.000011
System lock           0.000006
optimizing            0.000004
statistics            0.000011
preparing             0.000009
executing             0.000002
Sending data          0.034015 ########
end                   0.000012
query end             0.000006
closing tables        0.000011
freeing items         0.000036
cleaning up           0.000010

E então aqui está na minha grande instância do AWS ec2 usando um banco de dados do RDS mysql:

starting                0.000068
checking permissions    0.000016
Opening tables          0.000028
init                    0.000024
System lock             0.000018
optimizing              0.000015
statistics              0.000022
preparing               0.000022
executing               0.000012
Sending data            0.446171 #########
end                     0.000036
query end               0.000018
closing tables          0.000023
freeing items           0.00009
cleaning up             0.000013

A maioria dos números é comparável, exceto pelo fato de que a parte Enviando dados é mais de dez vezes mais lenta na instância do RDS !! O que poderia explicar isso e como eu resolveria isso?

Aqui está a informação da instância do RDS:

    
por David542 13.02.2015 / 00:05

1 resposta

3

Sending data

The thread is reading and processing rows for a SELECT statement, and sending data to the client. Because operations occurring during this this state tend to perform large amounts of disk access (reads), it is often the longest-running state over the lifetime of a given query.

link

Eu suspeito que a velocidade de acesso ao disco é a diferença.

No seu primeiro teste, parece que você tem uma máquina local conectada a um servidor de banco de dados local com um disco rígido local. Em seu segundo teste, você está se conectando a um servidor de banco de dados remoto com um disco rígido remoto (ou seja, EBS).

O EBS (que é o que o RDS usa para armazenamento) é significativamente mais lento do que o armazenamento de instâncias, que imagino ainda pode ser mais lento que um disco local descarregado em sua estação de trabalho (especialmente se você tiver um SSD).

No entanto, em troca da perda de desempenho, você obtém vários benefícios possibilitados pela natureza abstrata do ELB:

  • A capacidade de tirar instantâneos da sua instância e lançar novas instâncias a partir do seu instantâneo
  • A capacidade de redimensionar seu disco
  • A capacidade de alterar o desempenho do seu disco (via IOPS provisionado)
  • A capacidade de sua instância do RDS ser movida de forma transparente para um novo host, o que pode ocorrer durante uma reinicialização ou alteração de tipo de instância

É por isso que a maioria das pessoas aceita a penalidade de desempenho.

Se a perda de desempenho for significativa, você poderá tentar algumas coisas:

  • IOPS provisionados
  • Execute sua própria instância do MySQL no EC2 usando o armazenamento de instâncias. No entanto, eu não recomendo isso, pois seria muito difícil evitar a perda de dados se a sua instância for interrompida e você não conseguirá redimensionar o disco se os dados aumentarem.
  • Execute sua própria instância do MySQL no EC2 usando o EBS em RAID
  • Escale horizontalmente, adicione réplicas de leitura se o IO no seu mestre estiver se tornando um gargalo
  • Implemente o armazenamento em cache de dados no seu aplicativo
por 13.02.2015 / 02:11