Gostaria de saber como é possível definir um limite superior para a quantidade de memória que o MySQL usa em um servidor Linux.
No momento, o MySQL continuará ocupando memória a cada nova consulta solicitada, de forma que eventualmente fique sem memória. Existe uma maneira de colocar um limite para que não mais do que essa quantidade seja usada pelo MySQL?
Respostas:
O uso máximo de memória do MySQL depende muito do hardware, de suas configurações e do próprio banco de dados.
Hardware
O hardware é a parte óbvia. Quanto mais RAM, melhores e mais rápidos discos ftw . Porém, não acredite nessas cartas de notícias mensais ou semanais. O MySQL não escala linear - nem mesmo em hardware Oracle. É um pouco mais complicado do que isso.
O ponto principal é: não existe uma regra geral para o que é recomendado para sua configuração do MySQL. Tudo depende do uso atual ou das projeções.
Configurações e banco de dados
O MySQL oferece inúmeras variáveis e opções para otimizar seu comportamento. Se você tiver problemas, realmente precisa se sentar e ler o manual (f'ing).
Quanto ao banco de dados - algumas restrições importantes:
InnoDB
,MyISAM
...)A maioria das dicas do MySQL sobre stackoverflow informará sobre 5-8 as chamadas configurações importantes. Em primeiro lugar, nem todos eles importam - por exemplo, alocar muitos recursos para o InnoDB e não usar o InnoDB não faz muito sentido porque esses recursos são desperdiçados.
Ou - muitas pessoas sugerem aumentar a
max_connection
variável - bem, eles mal sabem que isso também implica que o MySQL alocará mais recursos para atendê-losmax_connections
- se necessário. A solução mais óbvia pode ser fechar a conexão do banco de dados em seu DBAL ou diminuir owait_timeout
para liberar esses threads.Se você me entende - há muito, muito para ler e aprender.
Motores
Os mecanismos de mesa são uma decisão muito importante, muitas pessoas se esquecem deles logo no início e de repente se vêem lutando com uma
MyISAM
mesa de 30 GB que trava e bloqueia todo o seu aplicativo.Não quero dizer que MyISAM é uma merda , mas
InnoDB
pode ser ajustado para responder quase ou quase tão rápido quantoMyISAM
e oferece algo como travamento de linha,UPDATE
enquantoMyISAM
trava a tabela inteira quando é escrito.Se você tem liberdade para executar o MySQL em sua própria infraestrutura, também pode verificar o servidor percona, porque inclui muitas contribuições de empresas como Facebook e Google (eles sabem rápido), também inclui o próprio em substituição de
InnoDB
, chamadoXtraDB
.Veja minha essência para configuração de percona-server (e -client) (no Ubuntu): http://gist.github.com/637669
Tamanho
O tamanho do banco de dados é muito, muito importante - acredite ou não, a maioria das pessoas no Intarwebs nunca lidou com uma configuração grande e intensa do MySQL, mas ela realmente existe. Algumas pessoas vão trollar e dizer algo como, "Use PostgreSQL !!! 111", mas vamos ignorá-los por enquanto.
O resultado final é: a julgar pelo tamanho, a decisão sobre o hardware deve ser feita. Você realmente não pode fazer um banco de dados de 80 GB rodar rapidamente em 1 GB de RAM.
Índices
Não é: quanto mais, melhor. Apenas os índices necessários devem ser definidos e o uso deve ser verificado com
EXPLAIN
. Adicione a isso que o MySQLEXPLAIN
é realmente limitado, mas é um começo.Configurações sugeridas
Sobre esses
my-large.cnf
e osmy-medium.cnf
arquivos - nem sei para quem foram escritos. Faça o seu próprio.Cartilha de ajuste
Um ótimo começo é a cartilha de ajuste . É um script bash (dica: você vai precisar do linux) que pega a saída de
SHOW VARIABLES
eSHOW STATUS
e envolve em uma recomendação útil. Se o seu servidor já rodou há algum tempo, a recomendação será melhor, pois haverá dados para se basear.O tuning primer não é um molho mágico. Você ainda deve ler sobre todas as variáveis que ele sugere que mudem.
Lendo
Eu realmente gosto de recomendar o mysqlperformanceblog . É um ótimo recurso para todos os tipos de dicas relacionadas ao MySQL. E não é apenas o MySQL, eles também sabem muito sobre o hardware certo ou recomendam configurações para AWS, etc. Esses caras têm anos e anos de experiência.
Outro grande recurso é o planet-mysql , é claro.
fonte
tuning primer
, como isso se comparamysqltuner
?Usamos estas configurações:
para um servidor com as seguintes especificações:
fonte
O uso da memória do banco de dados é um tópico complexo. The MySQL Performance Blog faz um bom trabalho ao cobrir sua pergunta e lista muitos motivos pelos quais é extremamente impraticável "reservar" memória.
Se você realmente quiser impor um limite rígido, poderá fazê-lo, mas terá que fazê-lo no nível do sistema operacional, pois não há configuração embutida. No Linux, você pode utilizar o ulimit , mas provavelmente terá que modificar a maneira como o MySQL inicia para impor isso.
A melhor solução é ajustar o seu servidor, de forma que uma combinação das configurações de memória do MySQL usuais resulte em um uso de memória geralmente menor pela instalação do MySQL. É claro que isso terá um impacto negativo no desempenho do seu banco de dados, mas algumas das configurações que você pode ajustar
my.ini
são:Eu começaria lá e veria se você consegue os resultados que deseja. Existem muitos artigos por aí sobre como ajustar as configurações de memória do MySQL.
Editar:
Observe que alguns nomes de variáveis mudaram nas versões 5.1.x mais recentes do MySQL .
Por exemplo:
É agora:
fonte
mysqld.exe estava usando 480 MB de RAM. Descobri que adicionei este parâmetro ao my.ini
que reduziu o uso de memória de mais de 400.000 kb para 105.000 kb
fonte
em
/etc/my.cnf
:Bom trabalho no servidor com 256 MB de memória.
fonte
table_definition_cache
= 0? Alguma explicação seria bom. E você basicamente não está armazenando consultas em cache ... mesmo efeito se vocêquery_cache_type = 0
:)Se você está procurando otimizar seu contêiner docker mysql, o comando abaixo pode ajudar. Consegui executar o mysql docker container de 480 MB a meros 100 MB
docker run -d -p 3306: 3306 -e MYSQL_DATABASE = teste -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = teste -e MYSQL_PASSWORD = teste -v / mysql: / var / lib / mysql --name mysqldb --table_definition_cache = mysql --table_definition_cache --performance_schema = 0 --default-authentication-plugin = mysql_native_password
fonte