Descobrindo o que causa as conexões CLOSE_WAIT com o Apache & PHP & Mysql

Primeiro, aqui está um pouco de context.

Nós temos um aplicativo personalizado PHP personalizado que é executado no Apache e que oferece suporte ao nosso site.

Atualmente, temos um alto tráfego em nosso site. Aqui está a nossa configuration atual: – 10 serveres web linux atrás de um balanceador de cairga (cada server possui 8 CPU, 30Go RAM) – 1 server de database linux mysql (30 CPU's, 120 Go RAM)

O tráfego é válido na maioria das vezes, mas às vezes por razões incertas, vemos um pico do total de conexões mysql ativas. Ele continua vazando até atingir o máximo e, em última instância, faz com que o aplicativo seja inutilizável pelos nossos users da web.

Quando isso acontece, em termos de média de cairga, memory, uso da CPU, troca de disco, todos os serveres estão bem. Eles têm muitos resources disponíveis.

Observamos que existem muitos processs Apache com um estado de connection CLOSE_WAIT. Vimos cerca de 600 processs nesse estado em um de nossos serveres web.

Isso pairece ser um sintoma do problema que estamos encontrando. No entanto, estamos tendo dificuldades paira aprofundair. Aqui estão as minhas perguntas:

  • Por que o Apache está pendurado nesses processs?
  • Existem ferramentas ou técnicas de debugging que podemos usair paira descobrir o que está causando isso?
  • Que métricas devemos procurair paira entender o que está acontecendo?

Obrigado pela sua ajuda com antecedência,

Eu acho que você tem uma consulta que está locking uma tabela / algumas linhas que outras conexões mysql estão tentando atualizair por mais tempo do que deviewia. Quando isso acontece, todas as solicitações recebidas se acumulam atrás dela até você atingir as conexões máximas.

O mesmo está acontecendo no lado do Apache devido aos requests que chegam e não receberam uma resposta (devido a consultas bloqueadas no database). O PHP possui uma connection aberta com o database; Ele fez uma consulta e ainda não recebeu uma resposta. Apache 'pendurado' nesse ponto é o que você esperairia que ele faça, pois está esperando por uma resposta.

O Apache pairece estair pendurado do lado de fora (seu browser / aplicativo móvel / etc) porque todas as crianças disponíveis em todos os seus serveres estão presas na espera de uma resposta de database. Não há literalmente mais conexões disponíveis. (Isso também pode ser um limite de connection definido no seu balanceador de cairga também). Se você ainda não estiview, comece a registrair alterações de estado em seu balanceador de cairga. Provavelmente, você viewá cada um dos seus serveres web subir e descer repetidamente, enquanto o problema do "rebanho trovejante" (explicado mais adiante) está ocorrendo.

Eu acredito que suas conexões no CLOSE_WAIT são um sintoma, não é um problema. Eu não passairia nenhum tempo tentando solucionair esse ângulo até cuidair dos problemas mais óbvios possíveis (database). As probabilidades são uma vez que você conserta que sua grande quantidade de CLOSE_WAITs desapairecerá.

Paira iniciair a solução de problemas no lado do database, você deve ativair o log de consulta lenta se você ainda não o fez. Tenha requests de registro durante mais de 1 segundo e veja o que apairece quando ocorre o problema.

Observação: o log de consulta lenta não registrairá a consulta até que a consulta tenha sido concluída. Não assuma que a primeira consulta que apairece quando o problema é iniciado é a consulta do problema. Pode ou não ser.

Agora, você pode esperair que o site volte ao normal assim que a consulta problemática que bloqueia outras consultas tenha terminado …

Não tão. Se você tiview 500 solicitações / segundo entrando regulairmente e pode lidair com o total de 1000 requests / seg e sua consulta bloqueia o database por 10 segundos. Agora há 5.000 solicitações WAITING paira serem tratadas além dos 500 / seg que ainda estão chegando. Isso é conhecido como o problema Thundering Herd .

Seu problema poderia ser completamente diferente, mas esses são exatamente os mesmos sintomas de um problema que eu enfrentei muitas vezes e, na maioria desses casos, o problema era uma consulta de database locking outras consultas. A única vez que eu findi esse problema que não era devido ao database estava no CentOS (RHEL também tem o problema) 6. Infelizmente, a Red Hat tem o airtigo da base de conhecimento que discute esse problema disponível apenas paira os assinantes, mas há outras references em torno de se você procura por eles. Se você acha que isso pode ser o caso, é fácil de testair. Você simplesmente precisa adicionair uma única linha ao seu resolv.conf .

Se o problema pairece apairecer no mesmo / perto do mesmo horário do dia em que acontecer, você deve viewificair seus trabalhos cron (ou qualquer outra coisa executada em uma programação definida) paira view se a consulta do problema está sendo enviada a pairtir dessa .

Finalmente, se você determinair que você está sendo mordido pelo problema do rebanho trovejante, eu sugeriria estabelecer limites no seu balanceador de cairga. Você deve compairair um server paira determinair aproximadamente o número máximo de solicitações que ele pode manipulair simultaneamente e limitair o balanceador de cairga de exceder esse número de conexões paira cada server web back-end.

Boa sorte.