Como atribuo um limite de memória para mySQL?

7

O sintonizador mysql relata que o mySQL pode usar 166% do RAM instalado, como eu limito o uso da RAM?

[!!] Maximum possible memory usage: 426.8M (166% of installed RAM)

    
por HackToHell 08.08.2012 / 16:10

3 respostas

8

Você pode configurar

  • All MyISAM
  • Todo o InnoDB
  • Mistura de MyISAM e InnoDB

Antes de alocar memória para qualquer um dos mecanismos, é bom refletir sobre o que é o cache com cada mecanismo de armazenamento

Configurando para MYISAM

O mecanismo principal usado é o cache de chaves. Apenas armazena em cache páginas de índice de arquivos .MYI. Para dimensionar seu cache de chaves, execute a seguinte consulta:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Isso dará a Configuração Recomendada para o MyISAM Key Cache ( key_buffer_size ) dado seu conjunto de dados atual ( a consulta limitará a recomendação em 4G (4096M). Para SO de 32 bits, 4 GB é o limite. Para 64 bits, 8 GB.

Configurando o InnoDB

O principal mecanismo usado é o InnoDB Buffer Pool. Ele armazena em cache dados e páginas de índice de tabelas InnoDB acessadas. Para dimensionar seu InnoDB Buffer Pool, execute a seguinte consulta:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

Isso dará a Configuração Recomendada para o tamanho do InnoDB Buffer Pool ( innodb_buffer_pool_size ) dado o seu conjunto de dados atual.

Não se esqueça de redimensionar os arquivos de log do InnoDB (ib_logfile0 e ib_logfile1). MySQL Source Code coloca um limite dos tamanhos combinados de todos os arquivos de log do InnoDB deve ser < 4G (4096M). (NOTA: Os binários do Percona Server superam isso. Eu recentemente configurei um grande servidor de banco de dados com 4G para um único arquivo de log do InnoDB usando innodb_log_file_size )

Por questão de simplicidade, dados apenas dois arquivos de log, veja como você pode dimensioná-los:

  • Etapa 1) adicione innodb_log_file_size = NNN para /etc/my.cnf (NNN deve ser 25% de innodb_buffer_pool_size ou 2047M, o que for menor)
  • Etapa 2) service mysql stop
  • Etapa 3) rm / var / log / mysql / ib_logfile [01]
  • Etapa 4) serviço mysql start (ib_logfile0 e ib_logfile1 são recriados)

CAVEAT

No final de ambas as consultas, há uma consulta Inline: (SELECT 2 PowerOfTwo) B

  • (SELECT 0 PowerOf1024) fornece a configuração em bytes
  • (SELECT 1 PowerOf1024) fornece a configuração em kilobytes
  • (SELECT 2 PowerOf1024) fornece a configuração em megabytes
  • (SELECT 3 PowerOf1024) fornece as configurações em gigabytes
  • Nenhum poder menor que 0 ou maior que 3 é aceito

EPÍLOGO

Não há substituto para o senso comum. Se você tiver memória limitada, uma mistura de mecanismos de armazenamento ou uma combinação dos mesmos, será necessário ajustar-se a diferentes cenários.

Se você tem 2GB de RAM e 16GB de InnoDB, aloque 512M como innodb_buffer_pool_size .

Se você tem 2GB de RAM e 4GB de índices MyISAM, aloque 512M como key_buffer_size .

Se você tem 2GB de RAM e 4GB de índices MyISAM e 16GB InnoDB, aloque 512M como key_buffer_size e 512M como innodb_buffer_pool_size .

Possíveis cenários são infinitos !!!

Lembre-se: o que quer que você aloque, deixe RAM suficiente para Conexões DB e o Sistema Operacional.

    
por 08.08.2012 / 22:08
3

Você deve ajustar key_buffer_size e innodb_buffer_pool_size no seu my.cnf , essas duas são as configurações relacionadas à memória mais importantes. Para obter seus valores atuais, use o cliente de linha de comando show variables like 'key_buffer_size'; e show variables like 'innodb_buffer_pool_size'; in mysql .

    
por 08.08.2012 / 16:21
3

no caso do Myisam Engine

key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections

esse valor fornece a memória total possível que o mysql pode consumir. Isso deve ser menor que sua RAM ou quase 60% da RAM. caso innodb innodb_buffer_pool_size deve ser menor que sua RAM ou 60% do seu ram

Ajuste os valores acima, para que o uso da RAM seja de 60% da sua RAM.

    
por 08.08.2012 / 17:18