Solução para ERROR 1040 (HY000): Too many connections no MySQL

Marcado: , ,

Visualizando 1 post (de 1 do total)
  • Autor
    Posts
  • #12801
    Luis FatorBinario
    Luis FatorBinario
    Administrador

    Esta é uma situação complicada, um certo dia você tenta acessar o site ou qualquer URL no servidor, como por exemplo o phpMyAdmin, e depara-se com uma lentidão assombrosa. Quase sempre nesses casos o problema é no Banco de Dados.

    Recentemente tive um problema sério num servidor que abriga determinado site com meio milhão de acessos diários, e que mesmo sem muitos acessos naquele momento estava com grande lentidão ao abrir qualquer link que precisasse do MySQL.

    Ao investigar o ocorrido deparei-me com a seguinte mensagem ao verificar o Status do MySQL:

    ERROR 1040 (HY000): Too many connections

    *O comando para verificar isso é: /etc/init.d/mysql status

    Este erro não havia acontecido antes, e pesquisando sobre as causas não encontra-se muita coisa. Mas no caso deste servidor sei exatamente o que causou o problema: Como o site é muito acessado e está em um servidor dedicado recentemente alterei os limites do PHP-FPM para pm.max_children=200, setando o modo PHP para Dynamic.

    O que aconteceu foi um ataque DDoS simultâneo aos acessos normais fazendo com que os 200 processos de requisição fizessem respawn quase instantaneamente mesmo quando eu reiniciava os serviços ou o servidor.

     

    Mas e o que o MySQL tem a ver com a história?

    Quando configuramos um site ou servidor setamos os processos PHP-FPM para valores baixos, e no máximo o que aconteceria num ataque DDoS é o site sair do ar, sendo que resetando os serviços ele voltaria ao normal. Como eu havia alterado lá no painel o valor de max children para acima de 100, que é o valor padrão para o máximo de conexões default do MySQL, deveria também ter alterado os limites no MySQL.

    Para resolver isso edite o arquivo: /etc/mysql/my.cnf

    E abaixo da linha [mysqld] adicione os seguintes parâmetros:

    max_connections=300
    
    max_user_connections=280

    *Note que o valor para max_user_connections é um pouco menor que o max_connections, isso é para que um único usuário, em nosso caso web1 que é o usuário dono daquele site, não consiga floodar todas as requisições disponíveis.

    Em seguida reinicie o MySQL:

    > /etc/init.d/mysql restart

    Reinicie também o PHP e o NginX:

    > /etc/init.d/php5-fpm restart

    > /etc/init.d/nginx restart

     

    Verifique o Status do MySQL novamente e note que a mensagem de erro desapareceu.

Visualizando 1 post (de 1 do total)

Você deve fazer login para responder a este tópico.