Melhores configurações de cache do MySQL para servidor MySQL dedicado de 8 GB de RAM usando apenas InnoDB (banco de dados de 5 GB)

20

Eu sou um grande noob quando se trata de configurar o MySQL para desempenho. E, honestamente, não estou preocupado com o ajuste fino para extrair todo último desempenho do MySQL, mas sei que a coisa mais importante a fazer, que fornece alguns dos melhores resultados, é a configuração correta de caches / buffers.

Tentei simplificar as coisas usando apenas o InnoDB como um mecanismo de armazenamento. E eu tenho um servidor dedicado para MySQL. Possui 8 GB de RAM, como devo alocar isso para maximizar o desempenho? Gostaria de ajustar meu banco de dados inteiro na memória para obter o melhor desempenho. O banco de dados tem cerca de 5 GB. Isso é possível?

Quanta memória devo alocar para o cache da consulta? Quanto custa o buffer pool do InnoDB? Quanto custa o resto do computador (ou seja, processos não relacionados ao MySQL)? Etc.

Como não estou usando o MyISAM, não preciso colocar muita memória no cache de chaves correto?

billmalarky
fonte

Respostas:

25

Isso é difícil sem saber muito sobre o próprio banco de dados. Existem algumas ferramentas que você deve conhecer;

Sobre como armazenar todo o banco de dados na memória; Quaisquer consultas que estão fazendo alterações no banco de dados permanecerão abertas até que a gravação seja executada no disco. A única coisa que pode evitar que o disco seja um gargalo é um controlador de disco com um cache de gravação.

Eu começaria com as seguintes alterações dos padrões:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

Depois, veria como as coisas corriam e tentaria coisas diferentes com base (entre outras coisas) na saída das ferramentas mencionadas acima. Eu também certificaria o gráfico de tendências com uma ferramenta de monitoramento, como Munin ou Cacti , para ver com que tipo de carga de trabalho estou realmente lidando. Pessoalmente, tenho grande experiência com os plugins do MySQL fornecidos com o Munin.

Kvisle
fonte
Obrigado, vou tentar e ver se consigo aprender algo novo.
billmalarky
@billmalarky Bem-vindo ao serverfault! :) Lembre-se de votar ou marcar a pergunta como correta, se você estiver satisfeito com a resposta que recebeu.
`` Kvisle
+1 por recomendar mysqltuner.pl !!!
RolandoMySQLDBA 15/10
@ Kvisle Obrigado pela recepção! Estive em stackoverflow por um tempo (bem ... há alguns meses ...), mas sou novo no serverfault. Na verdade, eu hospedo o voxel.net e sua hospedagem pré-gerenciada (suporte ao sistema IE) é realmente ótima, mas achei que seria apropriado procurar uma visão externa também, para não parecer uma ferramenta completa ao conversar com eles sobre isso.
billmalarky
11
@ Kvisle Além disso, vou marcar uma resposta correta, mas eu quero que isso cozinhe um pouco para ter uma boa ideia.
billmalarky
9

IMHO você deve poder ir com

innodb_buffer_pool_size=5G

Isso representaria 62,5% da RAM com uma quantidade suficiente de RAM para o SO do servidor e memória para o DB Connections

@kvisle recomendado usando mysqltuner.pl. Esse script é excelente para julgar a quantidade de RAM a ser dedicada a join_buffer_size, sort_buffer_size, read_buffer_size e read_rnd_buffer_size. Esses 4 buffers somados são multiplicados por max_connections. Essa resposta é adicionada aos buffers estáticos (innodb_buffer_pool_size + key_buffer_size). As somas combinadas são relatadas. Se essa soma combinada exceder 80% da RAM, é quando você deve diminuir esses tamanhos de buffer. O mysqltuner.pl será muito útil nesse sentido.

Como todos os seus dados são do InnoDB, você pode tornar o key_buffer_size (buffer de cache de chaves para índices MyISAM) muito baixo (eu recomendo 64M).

Aqui está uma postagem que fiz no DBA StackExchange para calcular o tamanho recomendado de innodb_buffer_pool_size .

UPDATE 2011-10-15 19:55 EDT

Se você sabe que terá 5 GB de dados, minha primeira recomendação foi OK. No entanto, eu esqueci de adicionar uma coisa:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

O tamanho do arquivo de log deve ser 25% do InnoDB Buffer Pool

UPDATE 2011-10-16 13:36 EDT

A regra de 25% baseia-se estritamente no uso de dois arquivos de log. Embora seja possível usar vários arquivos de log do innodb, dois geralmente funcionam melhor.

Outros expressaram usando 25%

No entanto, com toda a justiça, alguém da empresa InnoBase Oy original expressou não usar a regra de 25% por ter um maior pool de buffers do InnoDB .

Naturalmente, a regra de 25% não pode funcionar quando há grandes quantidades de RAM. De fato, o maior tamanho innodb_log_file_size permitido usando apenas 2 arquivos de log é 2047M, pois o tamanho combinado do arquivo de log deve ser menor que 4G (4096M)

CASO EM PONTO: Um dos clientes de meu empregador tem um servidor de banco de dados com 192 GB de RAM. Não há como ter arquivos de log 48G. Eu simplesmente uso o tamanho máximo do arquivo para um arquivo de log do innodb, 2047M. O comentário do @ Kvisle na minha resposta simplesmente fornece um link informando que você não precisa se limitar a dois arquivos de log. Se você tiver N arquivos de log, eles não poderão totalizar 4G. Minha regra de 25% é apenas em um mundo perfeito (DB Server com 8 GB ou menos).

RolandoMySQLDBA
fonte
Obrigado, definitivamente vou usar o mysqltuner.pl. No entanto, devo perguntar, esse script ainda será preciso se meu banco de dados estiver vazio agora? Eu tenho todas as tabelas e esquemas configurados corretamente, mas nenhum dado real. Usei os 5 GB como um exemplo de tamanho que usaria no meu servidor dedicado atual (ou seja, quando o banco de dados ficar maior do que isso, provavelmente mudarei para um servidor dedicado melhor). Atualmente, o banco de dados está vazio (é um site totalmente novo que não foi lançado), mas eu quero ajustar o mysql para lidar com o dimensionamento bem antes do lançamento.
billmalarky
Atualizado minha resposta !!!
RolandoMySQLDBA 15/10
Quero comentar sobre o "Deve ser 25% do pool de buffers do InnoDB". Porque não é 100% verdade. Leia dev.mysql.com/doc/refman/5.0/en/… para obter uma resposta mais elaborada. Em termos de desempenho, ajuda muito a aumentar um pouco o tamanho do padrão, mas você não precisa maximizá-lo.
Kvisle
Rolando, obrigado pela ajuda. Marquei este tópico como referência. Além disso, estou usando esse script mysqltuner agora.
billmalarky