Páginas penduradas aguardando consulta, consumindo memória e demorando 2 horas para falhar

3

Veja a imagem anexada do Fusion Reactor, mostrando as páginas que continuam em execução. Os tempos subiram para milhões e eu os deixei para ver se eles terminariam, mas foi quando havia apenas 2 ou 3.

Agora estou recebendo dezenas de páginas que nunca terminam. E são consultas diferentes, não consigo ver nenhum padrão enorme, exceto que ele só parece se aplicar a três dos meus sete bancos de dados.

top mostra o uso da CPU coldfusion em torno de 70-120%, e cavar mais fundo nas páginas de detalhes do Fusion Reactor mostra que todo o tempo gasto é gasto somente nas consultas do Mysql.

show processlist não retorna nada incomum, executa 10 a 20 conexões no estado sleep .

Durante esse tempo, muitas páginas são concluídas, mas à medida que o número de páginas penduradas se acumula e elas parecem nunca terminar o servidor, acaba retornando as páginas brancas.

A única solução de curto prazo parece estar reiniciando o Coldfusion, o que está longe de ser ideal.

Um script do Node.js foi adicionado recentemente e executado a cada 5 minutos e verifica se há arquivos CSV em lote para processar, fiquei imaginando se isso estava causando um problema com o roubo de todas as conexões do MySQL, então desativei (o script não tem método connection.end ()), mas isso é apenas um palpite rápido.

Não tem ideia de por onde começar, alguém pode ajudar?

A pior parte é que as páginas NUNCA acabam, se o fizerem não seria tão ruim, mas depois de um tempo nada é servido.

Estou executando uma pilha CentOS LAMP com Coldfusion e NodeJS como minhas principais linguagens de script

ATUALIZAÇÃOANTESDEPOSTARATUALMENTE

Duranteotempoquelevouparaescreverestepost,queinicieidepoisdedesabilitaroscriptNodeereiniciaroColdfusion,oproblemapareceterdesaparecido.

MaseuaindagostariadeajudaparaidentificarexatamenteporqueaspáginasnãoexpirarameconfirmarqueoscriptdoNodeprecisadealgocomoconnection.end()

Alémdisso,issopodeacontecerapenassobcarga,entãonãotenho100%decertezadequefoieliminado

ATUALIZAÇÃO

Aindatendoproblemas,acabeidecopiarumadasconsultasqueestãoatualmenteematé70segundosnoFusionReactoreexecutá-lasmanualmentenobancodedadoseelasforamconcluídasemalgunsmilissegundos.Asconsultasemsinãoparecemserumproblema.

OUTRAATUALIZAÇÃO

Rastreamentodepilhadeumadaspáginasaindaemandamento.Oservidornãoparoudeservirpáginasporumtempo,todososscriptsdoNodeestãoatualmentedesativados

link

MAIS ATUALIZAÇÕES

Eu tinha mais alguns deles hoje - eles realmente terminaram e vi esse erro no FusionReactor:

Error Executing Database Query. The last packet successfully received from the server was 7,200,045 milliseconds ago. The last packet sent successfully to the server was 7,200,041 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

MESMO MAIS ATUALIZAÇÕES

Pesquisando o código, tentei procurar "2 h", "120" e "7200", pois achei que o tempo limite de 7200000ms foi uma coincidência demais.

Eu encontrei este código:

// 3 occurrences of this
createObject( "java", "coldfusion.tagext.lang.SettingTag" ).setRequestTimeout( javaCast( "double", 7200 ) );

// 1 occurrence of this 
<cfsetting requestTimeOut="7200">

As 4 páginas que fazem referência a essas linhas de código são executadas muito raramente, nunca apareceram nos logs com saídas de tempo de 2h + e estão em uma área protegida por senha, portanto não podem ser raspadas (eram para uploads de arquivos e CSV processamento, agora movido para nodejs).

É possível que essas configurações possam, de alguma forma, ser definidas por uma página, mas existirem no servidor e afetarem outras solicitações?

    
por Pete 15.10.2015 / 11:30

2 respostas

4

1) postar um rastreamento de pilha.

Eu garanto que eles estarão esperando Socket.read () (ou similar)

O que está ocorrendo é que 1/2 da conexão tcp ao db está sendo fechada, deixando c.f. esperando por uma resposta que nunca conseguirá.

Existem problemas de rede entre o c.f. caixa e o db.

Os drivers do Java em geral são ruins para lidar com isso

Obrigado pelo rastreamento de pilha

Isso confirma minha suposição de que é 1/2 o fechamento da conexão tcp.

Eu suspeito que um dos seguintes 1) o mysql está no linux e há um bug na pilha TCP, então você precisa atualizar o linux nessa caixa - sim, eu já vi isso antes 2) coldfusion está no linux ... como por 1) 3) há um cabo / hardware defeituoso em ou entre uma das caixas 4) se você estiver executando o Windows, desative o TCP OFFLOAD !!!

número 3) é o disco rígido. Você precisaria executar o wireshark em ambas as caixas & provar perda de pacotes. A solução mais simples seria mover as VMs Rackspace para diferentes hosts físicos & veja se vai embora. (Há uma chance rara de que seu código seja muito ruim e você está saturando a rede entre a caixa CF e a caixa do MySQL, mas não tenho certeza se é possível escrever um código tão ruim)

    
por 15.10.2015 / 14:07
0

Eu passei mais algum tempo investigando isso e tenho mais detalhes sobre a causa específica dos problemas de rede e um trabalho encontrado com alguma ajuda de Charlie Arehart.

Primeiramente, a conexão de rede estava sendo interrompida por um script automatizado que acionava iptables restart . Isso estava atualizando uma lista de endereços IP que poderia acessar o servidor, mas também quebrando quaisquer conexões entre o aplicativo e o servidor de banco de dados.

Era mais provável que acontecesse em páginas mais lentas ou mais frequentes, mas qualquer coisa que coincidisse com o código iptables restart seria cortada.

A Rackspace achou isso para mim e sugeriu alterar o código de:

/sbin/service iptables restart

para

/sbin/iptables-restore < /etc/sysconfig/iptables

Isso impede que o serviço seja reiniciado e apenas se aplica a novas conexões.

Esta foi a causa raiz do problema, mas o problema real é o fato de que o Coldfusion, ou realmente o JDBC abaixo, não pararia de esperar pela resposta do servidor de banco de dados.

Não tenho certeza de onde o tempo limite de 2 horas chegou (supondo que seja um padrão), mas Charlie mostrou uma maneira de definir um tempo menor na string de conexão CFIDE - isso diz ao CF para esperar um tempo máximo antes de desistir o DB.

Portanto, nossa string de conexão é:

__fusionreactor_name=datasourcename;connectTimeout=600000;socketTimeout=600000;

Não consigo me lembrar dos detalhes desses dois, mas eles estão definindo um tempo em milissegundos para esperar e depois desistir da conexão do banco de dados:

  • connectTimeout = 600000;
  • socketTimeout = 600000;

Este é simplesmente rotular a fonte de dados no Fusion Reactor - se você tiver, é muito útil para encontrar problemas em seus aplicativos CF. Se você não tiver o Fusion Reactor, deixe isso para fora.

  • __ fusionreactor_name = dsnapi;

Você terá que aplicar isso a cada fonte de dados em seu CFIDE

    
por 29.02.2016 / 10:43