Como melhorar o desempenho do servidor MySQL com otimização adequada

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

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

Últimos artigos