- Este tópico contém 0 resposta, 1 voz e foi atualizado pela última vez 7 anos, 11 meses atrás por
Luis FatorBinario.
-
AutorPosts
-
03/05/2017 às 09:10 #12801
Luis FatorBinario
AdministradorEsta é 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.
-
AutorPosts
- Você deve fazer login para responder a este tópico.