Como solucionar um servidor que não responde

2

Estou testando o desempenho do meu aplicativo da web baseado em Java (Grails) que é implantado no Tomcat. O servidor tem os seguintes serviços em execução:

  • Apache HTTPD
  • Apache Tomcat
  • MySql
  • RabbitMQ

Embora eu entenda que, em um mundo ideal, esses serviços seriam executados em três servidores separados, mas só quero ver como meu aplicativo se comporta com alguma carga. Descobri que a execução de 20 threads com período de aumento acima de 40 segundos parece deixar o servidor sem resposta. No entanto, não consigo identificar exatamente o que está causando a falta de resposta do servidor

No momento em que eu teria o SSH, mas quando ele não responde, não consigo mais usar o SSH na máquina. Aqui estão os dados do TOP quando ele não responde e eu não consigo nem mesmo SSH nele. Não parece sugerir por que não responderia.

Pergunta

  • Como posso depurar o que está causando a falta de resposta do servidor?
por birdy 27.09.2014 / 15:08

1 resposta

2

A primeira coisa que eu faria é reduzir a probabilidade de que qualquer um desses processos consiga mais CPU ou tempo de IO em disco do que o sistema operacional. Eu vou assumir que seu sistema operacional é linux.

Faça backup de todos os arquivos de configuração antes de editá-los.

Você pode conseguir algumas dicas para o comportamento do sistema operacional antes da falha, observando os dados do sar.

sar -A | more

Certifique-se de procurar uma escalada na memória ou no uso da CPU. Você pode fazer com que o sar seja executado com mais frequência editando /etc/cron.d/sysstat, supondo que ele esteja instalado e ativado.

Para cada uma das contas de serviço em que seus processos estão sendo executados, você pode adicionar o seguinte a /etc/security/limits.conf no final do arquivo.

apache      soft    priority    19
apache      hard    priority    19
rabbitmq    soft    priority    18
rabbitmq    hard    priority    18
mysql       soft    priority    10
mysql       hard    priority    10

Então, em cada um dos scripts de inicialização para seus daemons, reduza o tempo de CPU e IO atribuído a eles.

cp -p /etc/rc.d/init.d/some_init_script ~/'date '+%Y%m%d.%H%M''.some_init_script
vi /etc/rc.d/init.d/some_init_script

Adicione o seguinte na segunda linha do script para reduzir as fatias de tempo da CPU e do E / S:

renice 19 -p $$ > /dev/null 2>&1
ionice -c3 -p $$ > /dev/null 2>&1

Reinicie cada um dos seus serviços.

Vamos supor que o sshd ainda não responda. Se você instalar a "tela", poderá ter o vmstat, o iotop e outras ferramentas em execução em várias telas. Há folhas de dicas sobre o uso da tela, então não vou cobrir isso aqui.

Neste ponto, mesmo que seus serviços estejam ficando fora de controle, você ainda deve ter a capacidade de ssh para o servidor, supondo que ele não esteja provocando pânico.

Você pode restringir ainda mais os recursos alocados a cada daemon fixando-os em um núcleo ou CPU específico. Isso pode ser feito com o comando "taskset". man taskset para mais detalhes sobre seu uso.

[edit] Eu também devo acrescentar que isso não ajudará em certas condições de spinlock. Se o acima não ajudar, você pode ter que executar seus aplicativos em uma VM e usar um kernel de depuração ou outras ferramentas de depuração.

    
por 01.01.2015 / 01:05