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_packetquando 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
ISAMeMyISAMcompactadas 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
BLOBsã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óriaHEAPpara uma tabela baseada em discoMyISAMquando necessário. Para contornar este problema, você pode aumentar o tamanho da tabela temporária configurando a opçãotmp_table_sizedomysqld, ou configurando a opção do SQLSQL_BIG_TABLESno 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 omysqldcom a opção--big-tablespara 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 colunaBLOButiliza de 5 a 8 bytes mais o tamanho dos dados contidos na mesma. O manipulador de tabelasISAM/MyISAMirã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-tablesfecha (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.