5. Configurando a memória para o sistema operacional
Calculando a memória necessária para o sistema operacional
Antes de alocar memória para o MySQL, é importante garantir que o sistema operacional (SO) tenha memória suficiente para executar suas tarefas básicas. Se o sistema operacional estiver com pouca memória, isso pode levar a sérios problemas de desempenho, incluindo a troca de memória para disco, o que pode diminuir drasticamente o desempenho do MySQL.
Para calcular a memória necessária para o sistema operacional, considere os seguintes fatores:
Memória base do sistema operacional:
O sistema operacional requer uma quantidade básica de memória para executar processos e serviços principais. Em sistemas Linux, isso normalmente varia de 200 MB a 1 GB, dependendo da distribuição e configuração.
Processos e serviços adicionais:
Se o servidor estiver executando serviços adicionais, como servidores web (Apache/Nginx), servidores de aplicativos ou serviços de monitoramento, memória adicional deverá ser alocada a eles.
Buffer e cache do sistema operacional:
Os sistemas operacionais usam buffers e caches para melhorar o desempenho de E/S. Por exemplo, o Linux usa cache de arquivos para armazenar dados acessados com frequência. Isso requer memória adicional suficiente.
Em geral, uma boa regra é deixar cerca de 20-25% da memória física total para o sistema operacional e outros serviços. Por exemplo, em um servidor com 16 GB de RAM:
Memory for OS = 0.20 × 16GB = 3.2GB
Evitando a troca de memória virtual para disco
A troca é o processo pelo qual os dados da memória física são movidos para o disco quando a memória física está cheia. Isso pode ser muito prejudicial para o desempenho do MySQL porque o acesso ao disco é muito mais lento do que o acesso à memória. Para evitar a troca, as seguintes etapas podem ser executadas:
Ajustando a troca:
Em sistemas Linux, o parâmetro swappiness determina a agressividade com que o kernel usará swaps. O valor de swappiness pode ser ajustado para reduzir o uso de swaps. Valores mais baixos (por exemplo, 10) reduzem a tendência do sistema de usar swaps:
sudo sysctl vm.swappiness=10
Para tornar essas alterações permanentes, adicione-as ao /etc/sysctl.conf:
vm.swappiness=10
Monitoramento de uso de memória:
Use ferramentas de monitoramento para ficar de olho no uso e nas trocas de memória do sistema. Ferramentas como htop, free ou monitoramento gráfico como Grafana podem ajudar a monitorar o uso de memória em tempo real.
Alocando memória com sabedoria para MySQL:
Certifique-se de que a configuração do MySQL não use toda a memória física. Deixe memória suficiente para o sistema operacional e outros serviços. Por exemplo, se você tiver 16 GB de RAM e tiver calculado que o sistema operacional precisa de cerca de 3,2 GB, aloque cerca de 12 a 13 GB para o MySQL.
Otimização do uso de memória do MySQL:
Conforme explicado anteriormente, ajuste os parâmetros de memória do MySQL, como innodb_buffer_pool_size, key_buffer_size e query_cache_size, para garantir que o uso total da memória do MySQL não exceda a memória disponível.
6. Configurando a memória para cache
O cache é um componente importante no MySQL que ajuda a melhorar o desempenho armazenando dados acessados com frequência na memória, reduzindo assim a necessidade de acessar discos mais lentos. Usando o cache de forma eficaz, você pode melhorar a velocidade da consulta e reduzir a carga no sistema de armazenamento. Os dois principais tipos de caches usados no MySQL são o cache MyISAM e o cache InnoDB.
Configurando o cache para MyISAM e InnoDB
MyISAM Cache
MyISAM é um mecanismo de armazenamento MySQL mais antigo e usa key_buffer_size como parâmetro principal para definir o tamanho de seu cache de índice. Esse parâmetro é muito importante porque os índices armazenados em cache podem ser acessados muito mais rapidamente do que os índices que precisam ser lidos do disco.
key_buffer_size: Especifica o tamanho do cache para o índice MyISAM. Definir esse tamanho muito pequeno pode levar a um acesso lento frequente ao disco, enquanto defini-lo muito grande pode deixar um pouco de memória para outras necessidades. Como regra geral, key_buffer_size deve ser definido entre 25-30% da memória física total em um servidor que usa apenas MyISAM.
Exemplos de configurações no arquivo de configuração do MySQL (my.cnf):
[mysqld]
key_buffer_size = 4G
InnoDB Cache
O InnoDB é o mecanismo de armazenamento padrão e mais usado no MySQL. O InnoDB usa innodb_buffer_pool_size para configurar o cache principal que armazena os dados e índices das tabelas do InnoDB.
innodb_buffer_pool_size: Especifica o tamanho do buffer pool usado para armazenar dados e índices. Essa configuração é crítica para o desempenho do InnoDB porque os dados acessados com frequência são armazenados em um buffer pool, reduzindo o acesso ao disco. Como regra geral, innodb_buffer_pool_size deve ser definido entre 60-80% da memória física total em um servidor que usa apenas InnoDB.
Exemplos de configurações no arquivo de configuração do MySQL (my.cnf):
[mysqld]
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances: Se o pool de buffers for grande (mais de 1 GB), você poderá dividi-lo em várias instâncias para aumentar a simultaneidade. Por exemplo, se innodb_buffer_pool_size estiver definido como 12 GB, você poderá dividi-lo em 4 instâncias de 3 GB cada:
[mysqld]
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 4
Outros artigos interessantes
Cache de consulta (geral)
O MySQL também possui um cache de consulta que armazena os resultados de consultas repetidas com frequência para acelerar o tempo de execução das consultas subsequentes. No entanto, na versão mais recente, o cache de consulta é considerado obsoleto e foi removido no MySQL 8.0 devido a problemas de desempenho em ambientes com muitas gravações.
query_cache_size: Se você estiver usando uma versão mais antiga do MySQL, poderá definir o tamanho da consulta de cache com este parâmetro. No entanto, recomendamos o uso de cache no nível do aplicativo ou proxies de cache para melhor gerenciamento.
[mysqld]
query_cache_size = 256M