Todos os produtos
Search
Central de documentação

ApsaraDB RDS:MySQL memory allocation

Última atualização: Sep 24, 2026

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

innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + key_buffer_size + query_cache_size

Memória por sessão

sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + binlog_cache_size + tmp_table_size

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

innodb_buffer_pool_size

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.

innodb_log_buffer_size

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.

innodb_additional_mem_pool_size

2 MB

Ele armazena estruturas de dados internas do InnoDB. Aumente este valor se a instância tiver muitas tabelas.

key_buffer_size

16 MB

Ele armazena em cache os índices de tabelas MyISAM. Para tabelas MyISAM, o sistema armazena os caches de índice em key_buffer e os caches de dados na memória do sistema operacional. Defina este valor como 16 MB para todas as instâncias do RDS.

query_cache_size

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

read_buffer_size

256 KB

Não

Buffer de varredura sequencial. O MySQL o verifica antes das leituras físicas para reduzir a E/S.

read_rnd_buffer_size

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.

sort_buffer_size

256 KB

Não

Buffer de classificação para operações ORDER BY e GROUP BY. Se os dados a serem classificados excederem este tamanho, o MySQL grava uma tabela temporária no disco. No Linux, definir este valor acima de 2 MB altera a alocação de memória de malloc() para mmap(), o que reduz a eficiência.

join_buffer_size

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.

binlog_cache_size

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.

tmp_table_size

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: [Err] 1114 - The table '/home/mysql/data3081/tmp/#sql_6197_2' is full

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.