A memória da instância RDS divide-se em duas categorias: memória compartilhada e memória privada específica da sessão. A memória compartilhada é alocada uma única vez na inicialização da instância e usada por todas as conexões. Já a memória privada específica da sessão é alocada sob demanda para cada conexão — toda consulta ativa que exija ordenação, junção ou leitura de dados reserva imediatamente o tamanho total do buffer. Em cenários de alta concorrência, essa alocação por conexão é a principal causa de erros de falta de memória (OOM) e failover entre primário e secundário.
Cálculo da memória
A fórmula abaixo demonstra como estimar o uso total de memória:
Total memory ≈ Shared memory
+ max_connections × per-session memory per connection
|
Componente |
Parâmetros |
|
Memória compartilhada |
|
|
Memória por sessão |
|
Memória compartilhada
Execute a consulta a seguir para verificar a alocação de memória compartilhada:
SHOW VARIABLES WHERE Variable_name IN (
'innodb_buffer_pool_size',
'innodb_log_buffer_size',
'innodb_additional_mem_pool_size',
'key_buffer_size',
'query_cache_size'
);
O exemplo abaixo mostra a saída de uma instância de 240 MB:
+---------------------------------+-----------------+
| Variable_name | Value |
+---------------------------------+-----------------+
| innodb_additional_mem_pool_size | 2097152 |
| innodb_buffer_pool_size | 67108864 |
| innodb_log_buffer_size | 1048576 |
| key_buffer_size | 16777216 |
| query_cache_size | 0 |
+---------------------------------+-----------------+
Parâmetros
|
Parâmetro |
Padrão no RDS |
Descrição |
|
|
64 MB (instância de 240 MB) |
Buffer pool do InnoDB. Armazena páginas de dados, páginas de índice, páginas de undo, buffers de inserção, índices hash adaptativos, bloqueios e dicionários de dados. Todas as operações de leitura e escrita SQL atuam sobre o buffer pool em vez dos arquivos físicos de dados — a gravação em disco ocorre posteriormente, por meio de checkpoints. Um buffer pool maior melhora o desempenho de leitura e escrita, mas aumenta o tempo de recuperação após falhas. |
|
|
1 MB |
Buffer de log do InnoDB. Retém os redo logs antes da liberação para o disco. A liberação é acionada a cada segundo pela thread mestre, em cada commit de transação e sempre que o espaço disponível no buffer cai abaixo da metade do tamanho total. O valor de 1 MB atende à maioria das cargas de trabalho. |
|
|
2 MB |
Reserva espaço para estruturas internas de dados do InnoDB. Aumente esse valor se sua instância possuir um grande número de tabelas. |
|
|
16 MB |
Faz cache de índices de tabelas MyISAM. Para tabelas MyISAM, os caches de índice ficam em |
|
|
0 (desativado) |
Armazena resultados de consultas com base no hash da instrução SQL. Este recurso vem desativado nas instâncias RDS. Como o cache é invalidado sempre que uma tabela sofre modificação, ele não é adequado para cargas de trabalho com muitas escritas. |
Memória privada específica da sessão
Diferentemente da memória compartilhada, os buffers de sessão não são pré-alocados na inicialização. Cada parâmetro tem seu valor integralmente alocado no momento em que uma consulta o solicita. Quando há muitas conexões simultâneas, a soma dessas alocações pode ultrapassar a memória disponível e provocar erros OOM.
Para inspecionar a alocação de memória da sessão, execute esta consulta:
SHOW VARIABLES WHERE Variable_name IN (
'read_buffer_size',
'read_rnd_buffer_size',
'sort_buffer_size',
'join_buffer_size',
'binlog_cache_size',
'tmp_table_size'
);
Saída de exemplo:
+-------------------------+-----------------+
| Variable_name | Value |
+-------------------------+-----------------+
| binlog_cache_size | 262144 |
| join_buffer_size | 262144 |
| read_buffer_size | 262144 |
| read_rnd_buffer_size | 262144 |
| sort_buffer_size | 262144 |
| tmp_table_size | 262144 |
+-------------------------+-----------------+
Parâmetros
|
Parâmetro |
Padrão no RDS |
Modificável no console |
Descrição |
|
|
256 KB |
Não |
Buffer para varredura sequencial. A leitura ocorre antes do acesso físico ao disco para reduzir I/O. |
|
|
256 KB |
Não |
Buffer para varredura aleatória. Utilizado quando as linhas são lidas em ordem classificada após uma varredura de índice. |
|
|
256 KB |
Não |
Buffer de ordenação para operações |
|
|
256 KB |
Não |
Buffer para operações de junção. O ApsaraDB RDS for MySQL suporta apenas o algoritmo nested loop join. A tabela não condutora é armazenada neste buffer para evitar contenção no buffer pool. |
|
|
256 KB |
Não |
Cache do binary log. Retém logs de transações antes do commit e libera-os para o arquivo de binary log em disco após o commit. |
|
|
256 KB |
Sim |
Tamanho máximo de uma tabela temporária em memória. Caso uma consulta crie uma tabela temporária que ultrapasse esse limite, o MySQL a converte em uma tabela MyISAM em disco. Ao encontrar o erro abaixo, aumente este valor: |
Nota: Apenas o parâmetro tmp_table_size pode ser modificado no console RDS. Os demais parâmetros de buffer de sessão não são alteráveis por essa interface.