AWS

8 dez, 2016

Atualização do Amazon Aurora – Leitura paralela adiantada, indexação rápida, consciência NUMA

Publicidade

O Amazon Aurora é, atualmente, o serviço AWS que cresce mais rápido!

Como um banco de dados relacional projetado para a nuvem (leia Amazon Aurora – New Cost-Effective MySQL-Compatible Database Engine for Amazon RDS para saber mais), o Aurora oferece um excelente desempenho, dimensionamento fácil do armazenamento até 64 TB, durabilidade e alta disponibilidade. Uma vez que o Aurora foi projetado para ser compatível com o MySQL, os nossos clientes têm sido capazes de mover suas aplicações existentes e construir novas com facilidade.

Com a compatibilidade do MySQL “em cima” e a arquitetura voltada para nuvem do Aurora “embaixo”, temos um monte de espaço para inovar. Podemos tornar o Aurora ainda mais eficiente e ainda mantê-lo compatível com todas as aplicações.

Hoje estamos fazendo três melhorias de desempenho no Aurora; cada uma delas para tornar o o seu desempenho maior em uma ampla gama de cargas de trabalho comumente executados pelos clientes da AWS. Aqui está um resumo:

  • Leitura paralela adiantada – Seleção de intervalo, varreduras completas de tabelas, alterações de tabela e geração de índices são agora até 5x mais rápidas;
  • Construção de Indexação rápida – A geração de índices é agora cerca de 75% mais rápida;
  • Agendamento consciente-NUMA – Quando executado em instâncias com mais de um chip de CPU, leituras a partir do cache de consultas e o cache de buffer são mais rápidos, melhorando o rendimento geral em até 10%.

Agora, vamos mergulhar de cabeça…

Leitura paralela adiantada

O mecanismo de armazenamento InnoDB, usado pelo MySQL, organiza as linhas da tabela e o armazenamento subjacente (páginas de disco) utilizando as chaves de índice. Isso torna as varreduras sequenciais sobre as tabelas completas rápidas e eficientes para as tabelas recém-criadas.

No entanto, como as linhas são atualizadas, inseridas e excluídas ao longo do tempo, o armazenamento se torna fragmentado, as páginas não são mais fisicamente sequenciais e as varreduras podem ser dramaticamente retardadas. O recurso linear de leitura paralela adiantada do InnoDB busca lidar com esta fragmentação, trazendo até 64 páginas para a memória antes que elas sejam realmente necessárias. Embora bem-intencionado, esse recurso não fornece uma melhoria de desempenho significativo em cargas de trabalho em escala empresarial.

Com a atualização de hoje, o Aurora agora lida bem melhor com esta situação muito comum. Quando o Aurora verifica uma tabela, ele identifica logicamente (em oposição a fisicamente) e, em seguida, efetua uma pré-busca paralela das páginas adicionais. A pré-busca paralela tira proveito da arquitetura de armazenamento replicado do Aurora (duas cópias em cada uma das três zonas de disponibilidade) e ajuda a assegurar que as páginas no cache do banco de dados são relevantes para a operação de varredura.

Como resultado dessa mudança, a seleção de intervalos, a varredura completa de tabelas, a operação ALTER TABLE e a geração de índices são até 5 vezes mais rápidas do que antes.

Você verá que o desempenho melhorou assim que você atualizar para o Aurora 1.7 (veja abaixo para mais informações).

Construção de indexação rápida

Quando você cria um índice primário ou secundário em uma tabela, o mecanismo de armazenamento cria uma estrutura de árvore que contém as novas chaves. Este processo implica em uma série de buscas top-down nas árvores e uma abundância de páginas de divisão a medida que a árvore é reestruturada para acomodar mais e mais chaves.

Aurora agora constrói as árvores de uma forma de baixo para cima, construindo as folhas em primeiro lugar e, em seguida, adicionando páginas pai, conforme necessário. Isto reduz a quantidade de vai-e-vem ao armazenamento e também previne a necessidade de dividir as páginas, já que cada página é preenchida por vez.

Com esta mudança, a adição de índices e a reconstrução das tabelas é agora até 4 vezes mais rápida do que antes, dependendo do esquema da tabela. Por exemplo, a equipe do Aurora criou uma tabela com o seguinte esquema e acrescentou 100 milhões de linhas, resultando em uma tabela de 5 GB:

create table test01 (id int not null auto_increment primary key, i int, j int, k int);

Em seguida, eles acrescentaram quatro índices adicionais:

alter table test01 add index (i), add index (j), add index (k), add index comp_idx(i, j, k);

Em uma instância db.r3.large, o tempo para executar esta consulta caiu de 67 para 25 minutos. Em uma instância db.r3.8xlarge, o tempo caiu de 29 para 11,5 minutos.

Este é um recurso novo e nós gostaríamos que você experimentasse em suas cargas de trabalho de não-produção. Você precisará atualizar para o Aurora 1,7 e, em seguida, definir o aurora_lab_mode como 1 no grupo DB Instance Parameter (veja  DB Cluster and DB Instance Parameters para saber mais):

rds_aurora_set_lab_mode_1

A equipe está muito interessada nos seus comentários sobre essa melhoria de desempenho. Por favor, sinta-se à vontade para postar suas observações na Fórum do Amazon RDS.

Agendamento consciente-NUMA

A maior Instância DB (db.r3.8xlarge) tem dois chips de CPU e uma característica comumente conhecidos como NUMA, abreviação de Non-Uniform Memory Access. Em sistemas deste tipo, cada fração igual de memória principal é diretamente acessível e eficiente para cada CPU. A memória restante é acessível através de um caminho de acesso cross-CPU um pouco menos eficiente.

O Aurora agora faz um trabalho melhor de agendamento de tópicos através das CPUs, a fim de aproveitar essa disparidade de tempos de acesso. Os tópicos não precisam mais lutar uns contra os outros para o acesso à memória menos eficiente, associadas a outros processadores. Como resultado, as operações vinculadas à CPU que fazem uso pesado do cache de consultas e o cache de buffer agora executam até 10% mais rápido.

A melhoria de desempenho será mais aparente quando você estiver fazendo centenas ou milhares de ligações para a mesma instância de banco de dados. Como exemplo, o desempenho no benchmark oltp.lua da Sysbench cresceu de 570.000 leituras/segundo para 625.000 leituras/segundo.  O teste foi executado em uma Instância DB db.r3.8xlarge com os seguintes parâmetros:

  • oltp_table_count=25
  • oltp_table_size=10000
  • num-threads=1500

Você verá uma melhora no desempenho assim que você atualizar para o Aurora 1.7.

Atualizando para o Aurora 1,7

Instâncias de banco de dados recém-criadas serão automaticamente executadas no Aurora 1.7. Para instâncias de banco de dados existentes, você pode optar por instalar a atualização imediatamente ou durante a sua janela de manutenção seguinte.

Você pode confirmar se você está executando Aurora 1.7 executando a seguinte consulta:

mysql> show global variables like "aurora_version";
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| aurora_version | 1.7   |
+----------------+-------+