Como o MariaDB Utiliza a Memória
A lista abaixo indica algumas das maneiras inas quais o servidor mysqld
utiliza a memória. Onde aplicável, o nome da variável do servidor relevante ao uso de memória é fornecido:
- O buffer de chave (variável
key_buffer_size
) é compartilhado por todas as threads; Outros buffers usados pelo servido são alocados quando necessários. Leia "Parâmetros de Sintonia do Servidor". - Cada conexão utiliza algum espaço específico da thread: Uma de pilha (padrão de 64K, variável
thread_stack
), um buffer de conexão (variávelnet_buffer_lenght
), e um buffer de resultados (variávelnet_buffer_lenght
). Os buffers de conexões e resultados são aumentados dinamicamente paramax_allowed_packet
quando necessário. Quando uma consulta está sendo executada, uma cópia da string da consulta atual é também alocada. - Todas as threads compartilhas a mesma memória base.
- Somente as tabelas
ISAM
eMyISAM
compactadas são mapeadas em memória. Isto é porque o espaço de memória de 32-bits de 4GB não é grande o bastante para a maioria das grandes tabelas. Quando sistemas com endereçamento de 64-bits se tornarem comuns poderemos adicionar um suporte gieral para o mapeamento de memória. - Cada requisição fazendo uma varredura sequencial em uma tabela aloca um buffer de leitura (variável
read_buffer_size
). - Ao ler registros na ordem
randômica
(por exemplo, depois de uma ordenação) um buffer de leitura randômico é alocado para evitar pesquisas em disco. (variávelread_rnd_buffer_size
). - Todas as joins são feitas em um único passo, e a maioria delas podem ser feitas mesmo sem usar uma tabela temporária. A maioria das tabelas temporárias são tabelas baseadas em memória (HEAP). Tabelas temporárias com uma grande extensão de registros (calculada como a soma do tamanho de todas as colunas) ou que contenham colunas
BLOB
são armazenadas em disco.Um problema nas versões do MariaDB anteriores a 3.23.2 é que se uma tabela HEAP excede o tamanho de
tmp_table_size
, você recebe o erroThe table nome_tabela is full
. A partir da versão 3.23.2, isto é tratado alterando automaticamente a tabela em memóriaHEAP
para uma tabela baseada em discoMyISAM
quando necessário. Para contornar este problema, você pode aumentar o tamanho da tabela temporária configurando a opçãotmp_table_size
domysqld
, ou configurando a opção do SQLSQL_BIG_TABLES
no progrma cliente. Leia "Sintaxe deSET
". Na versão 3.20 do MariaDB, o número máximo da tabela temporária érecord_buffer*16
; se você estiver utilizando esta versão, você terá que aumentar o valorrecord_buffer
. Você também pode iniciar omysqld
com a opção--big-tables
para sempre armazenar as tabelas temporárias em disco. Entretanto isto afetará a velocidade de várias consultas complicadas. - A maioria das requisições que realizam ordenação alocam um bufer de ordenação e 0-2 arquivos temporários dependendo do tamanho do resultado. Leia Seção A.4.4, "Onde o MariaDB Armazena Arquivos Temporários".
- Quase todas as análises e cálculos são feitos em um armazenamento de memória local. Nenhuma sobrecarga de memória é necessário para ítens pequenos e a alocação e liberação normal de memória lenta é evitada. A memória é alocada somente para grandes strings inesperadas; isto é feito com
malloc()
efree()
. - Cada arquivo de índice é aberto uma vez e o arquivo de dados é aberto uma vez para cada thread concorrente. Uma estrutura de tabela, estrutura de coluna para cada coluna e um buffer de tamanho
3 * n
é alocado para cada thread concorrente. (onden
é o maior tamanho do registro, sem levar em consideração colunasBLOB
. Uma colunaBLOB
utiliza de 5 a 8 bytes mais o tamanho dos dados contidos na mesma. O manipulador de tabelasISAM
/MyISAM
irão usar um registro extra no buffer para uso interno. - Para cada tabela com colunas
BLOB
, um buffer é aumentado dinamicamente para ler grandes valoresBLOB
. Se você ler uma tabela, um buffer do tamanho do maior registroBLOB
é alocado. - Estruturas de manipulacão para todas tabelas em uso são salvos em um cache e gerenciado como FIFO. Normalmente o cache possui 64 entradas. Se uma tabela foi usada por duas threads ao mesmo tempo, o cache terá duas entredas para a tabela. Leia "Como o MariaDB Abre e Fecha as Tabelas".
- Um comando
mysqladmin flush-tables
fecha (ou instruçõesFLUSH TABLES
) todas tabelas que não estão em uso e marca todas tabelas em uso para serem fechadas quando a thread atualmente em execução terminar. Isto irá liberar efetivamente a maioria da memória em uso.
ps
e outros programas de informações do sistema podem relatar que o mysqld
usa muita memória. Isto pode ser causado pelas pilhas de threads em diferentes endereços de memória. Por exemplo, a versão do ps
do Solaris conta a memória não usada entre as pilhas como memória usada. Você pode verificar isto conferindo a memória disponível com swap -s
. Temos testado o mysqld
com detectores comerciais de perda de memória, portanto tais perdas não devem existir.