A memória da instância do RDS se divide em duas categorias: memória compartilhada e memória privada específica da sessão. O MySQL aloca a memória compartilhada uma única vez na inicialização da instância e a compartilha entre todas as conexões. Por outro lado, o sistema aloca a memória privada específica da sessão por conexão sob demanda. Cada consulta ativa que exige classificação, junção ou leitura de dados reserva imediatamente o tamanho total do seu 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 de alternâncias entre primário e secundário.
Como calcular a memória
A fórmula a seguir estima 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'
);
A saída a seguir refere-se a 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) |
Pool de buffers do InnoDB. Ele 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 gravação SQL usam o pool de buffers em vez de arquivos de dados físicos, e o sistema grava os dados em disco posteriormente por meio de checkpoints. Um pool de buffers maior melhora o desempenho de leitura e gravação, mas aumenta o tempo de recuperação de falhas. |
|
|
1 MB |
Buffer de log do InnoDB. Ele armazena redo logs antes de o sistema liberá-los para o disco. A thread mestre aciona a liberação a cada segundo, em cada commit de transação e sempre que o buffer disponível cai abaixo da metade do seu tamanho total. 1 MB é suficiente para a maioria das cargas de trabalho. |
|
|
2 MB |
Ele armazena estruturas de dados internas do InnoDB. Aumente este valor se a instância tiver muitas tabelas. |
|
|
16 MB |
Ele armazena em cache os índices de tabelas MyISAM. Para tabelas MyISAM, o sistema armazena os caches de índice em |
|
|
0 (desabilitado) |
Ele armazena em cache os resultados de consultas por hash de instrução SQL. Este parâmetro é desabilitado em instâncias do RDS. O MySQL invalida o cache sempre que uma tabela é modificada, o que o torna inadequado para cargas de trabalho com muitas gravações. |
Memória privada específica da sessão
Ao contrário da memória compartilhada, o MySQL não pré-aloca os buffers de sessão na inicialização. O sistema aloca cada valor de parâmetro integralmente no momento em que uma consulta precisa dele. Com muitas conexões simultâneas, a alocação acumulada pode exceder a memória disponível e acionar erros de OOM.
Execute a consulta a seguir para verificar a alocação de memória da sessão:
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'
);
Exemplo de saída:
+-------------------------+-----------------+
| 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 de varredura sequencial. O MySQL o verifica antes das leituras físicas para reduzir a E/S. |
|
|
256 KB |
Não |
Buffer de varredura aleatória. O MySQL o usa quando lê as linhas em ordem classificada após uma varredura de índice. |
|
|
256 KB |
Não |
Buffer de classificação para operações |
|
|
256 KB |
Não |
Buffer de operação de junção. O ApsaraDB RDS for MySQL suporta apenas o algoritmo de junção de loop aninhado. O sistema armazena a tabela não condutora neste buffer para evitar contenção no pool de buffers. |
|
|
256 KB |
Não |
Cache de log binário. Ele armazena logs de transações antes do commit e os libera para o arquivo de log binário no disco após o commit. |
|
|
256 KB |
Sim |
Tamanho máximo de uma tabela temporária na memória. Se uma consulta criar uma tabela temporária que exceda este limite, o MySQL a converterá em uma tabela MyISAM no disco. Se você encontrar o seguinte erro, aumente este valor: |
Nota: Você pode modificar apenas o tmp_table_size no console do RDS. O console não permite alterar os outros parâmetros de buffer de sessão.