Tunando o my.cnf para servidores com muita memória e CPU

Ajustar (“tunar”) o my.cnf corretamente faz muita diferença em servidores com muita RAM e muitos cores, principalmente em ambientes de hospedagem, WordPress e bancos com alta concorrência. Abaixo vai um guia prático, focado em MariaDB/MySQL modernos rodando em servidores parrudos.

Vou assumir um cenário comum:

  • Servidor dedicado ou VPS grande
  • 16+ cores
  • 64 GB, 128 GB ou mais de RAM
  • Uso intenso de InnoDB (WordPress, WooCommerce, sistemas web)

1️⃣ Princípios importantes antes de tunar

Antes de sair aumentando números:

InnoDB deve ser prioridade
Evite overcommit de memória
Prefira menos conexões bem atendidas do que milhares lentas
MySQL não escala linearmente só aumentando buffers

⚠ Erro comum: max_connections alto + buffers grandes = OOM killer.


2️⃣ Configurações essenciais para servidores com muita RAM

🔹 InnoDB Buffer Pool (o mais importante)

👉 Deve usar 60% a 75% da RAM total se o servidor for dedicado ao MySQL.

Exemplos:

RAM totalinnodb_buffer_pool_size
64 GB40G – 48G
128 GB80G – 96G
256 GB160G – 192G
innodb_buffer_pool_size = 96G
innodb_buffer_pool_instances = 16

📌 Regra prática:

  • Até 64G → 8 instâncias
  • 128G+ → 16 ou 32 instâncias

3️⃣ Ajustes de CPU e paralelismo

🔹 Threads e concorrência

innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_thread_concurrency = 0

0 = o MySQL se autoajusta
✔ Ideal para servidores com muitos cores


4️⃣ Log e Flush (performance vs segurança)

🔹 Log de transações

innodb_log_file_size = 4G
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 2

📌 Benefícios:

  • Escrita mais rápida
  • Menos I/O
  • Ideal para WordPress e aplicações web

⚠ Se precisar 100% ACID, use 1 (perde performance).


5️⃣ I/O e disco (SSD / NVMe)

🔹 Otimizações para SSD

innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

📌 Para NVMe rápidos:

innodb_io_capacity = 5000
innodb_io_capacity_max = 10000

6️⃣ Conexões e buffers (muito cuidado aqui)

🔹 Conexões simultâneas

Evite exagerar:

max_connections = 300

✔ Para WordPress com PHP-FPM bem ajustado, 200–400 é suficiente.


🔹 Buffers por conexão (NÃO exagere)

sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M

📌 Esses buffers são por conexão ativa.
300 conexões × buffers grandes = desastre.


7️⃣ Query Cache (MariaDB)

⚠ Em MySQL 8, não existe mais.
Em MariaDB, pode ajudar em leitura intensa.

query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 4M

✔ Bom para sites com muitas leituras repetidas
❌ Ruim para escrita intensa


8️⃣ Tabela temporária e memória

tmp_table_size = 512M
max_heap_table_size = 512M

✔ Evita tabelas temporárias em disco
✔ Ótimo para relatórios e consultas complexas


9️⃣ Configurações extras recomendadas

table_open_cache = 10000
table_definition_cache = 8000
open_files_limit = 100000

Ideal para servidores com muitos bancos e tabelas.


🔟 Exemplo de my.cnf para servidor grande (128 GB RAM)

[mysqld]
max_connections = 300

innodb_buffer_pool_size = 96G
innodb_buffer_pool_instances = 16

innodb_log_file_size = 4G
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 2

innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_thread_concurrency = 0

innodb_flush_method = O_DIRECT
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000

tmp_table_size = 512M
max_heap_table_size = 512M

sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M

table_open_cache = 10000
table_definition_cache = 8000
open_files_limit = 100000

1️⃣1️⃣ Ferramentas para validar seu tuning

mysqltuner
pt-query-digest (Percona Toolkit)
SHOW ENGINE INNODB STATUS\G
SHOW GLOBAL STATUS;


⚠ Alertas finais

🚫 Não copie configs cegamente
🚫 Não use 90% da RAM no MySQL se houver PHP, Nginx, Apache, Redis
🚫 Sempre reinicie o MySQL após mudar buffers grandes

Clique aqui e consulte nossos planos de Gerenciamento de Servidor