Pergunta

Nós temos um aplicativo que é composto de um par de fora das aplicações de prateleira PHP (ExpressionEngine e XCart), bem como o nosso próprio código personalizado.

Eu não fiz a análise real, então eu não sei exatamente como ele foi determinado, mas não estou surpreendido ao saber que muitas conexões MySQL estão sendo deixados unclosed (não estou surpreso porque eu tenho visto fugas de memória significativa no nosso servidor dev, onde ao longo de um ou dois dias, a partir de 100 MB durante a inicialização inicial, toda a giga de ram é consumido, e muito pouco do que é armazenada em cache).

Então, como é que vamos determinar precisamente qual o código PHP é o culpado? Eu tenho experiência prévia com XDebug, e sugeriram que, quando nós começamos a nossa separado, encenando ambiente razoavelmente estável, que retrofit XDebug em dev e usar isso para fazer algumas análises. É este razoável, e / ou que qualquer outra pessoa tem mais específica e / ou sugestões adicionais?

Foi útil?

Solução

Você pode usar o

 SHOW PROCESSLIST  

comando SQL para ver os processos que estão em execução. Isso irá dizer-lhe o nome de usuário, host, banco de dados, etc que estão em uso por cada processo. Isso deve lhe dar uma idéia do que está acontecendo, especialmente se você tem um número de bases de dados que está sendo acessado.

Mais aqui: http://codeinthehole.com/archives/2- monitorando-MySQL-processes.html

Outras dicas

Este não deve ser causada por um código php porque as conexões mysql devem ser fechadas automaticamente.

cf: http://www.php.net/manual/function .mysql-connect.php :

O link para o servidor será fechada tão logo a execução do script extremidades, a menos que seja fechada antes por -se explicitamente mysql_close ().

Algumas sugestões:

  • O seu developper tem tecnicamente um acesso directo ao seu servidor mysql produção? Se sim, então eles provavelmente apenas deixar seu Mysql Gestor aberto:)
  • você tem algum processo batch diária? Se sim, talvez que há algum processo zombi na memória

PHP fecha automaticamente todas as conexões MySQL quando termina a página. a única razão que uma aplicação web PHP teria muitas conexões mysql não fechadas é ou 1) que você está usando o pool de conexão, ou 2) há um erro no servidor MySQL ou o conector.

mas se você realmente quer olhar para o seu código para encontrar onde está a ligar, consulte http: // xdebug. org / docs / profiler

Como outros disse, PHP termina conexões MySQL criados através mysql_connect ou os equivalentes MSQLI / DOP.

No entanto, você pode criar conexões persistentes com mysql_pconnect. Ele vai olhar para as conexões existentes aberto e usá-las; se não puder encontrar um, ele vai abrir um novo. Se você tinha um monte de pedidos de uma só vez, poderia ter causado um monte de conexões para abrir e permanecer aberto.

Você poderia reduzir o número máximo de conexões, ou diminuir o tempo de espera para conexões persistentes. Veja os comentários na parte inferior do página homem para obter mais detalhes.

Eu costumava correr um script que entrevistou SHOW STATUS para contagem da linha e eu observei que o uso mysql_pconnect sempre incentivou elevado número de threads. Achei isso muito desconcertante porque então eu não poderia dizer quando a minha taxa de conexão foi realmente caindo. Então, tenho a certeza de centralizar todos os lugares onde mysql_connect () foi chamado e eliminar mysql_pconnect ().

A próxima coisa que fiz foi olhar para o tempo limite de conexão e ajuste-as mais como 30 segundos, porque. Então, eu ajustei meu my.cnf com

connect-timeout = 30

para que eu pudesse realmente ver o número de conexões de cair fora. Para determinar o número de conexões que você precisa aberto é dependente de quantos apache trabalhadores você estiver executando vezes o número de conexões de banco de dados que cada um será aberta.

A outra coisa que eu comecei a fazer foi adicionar uma nota para minhas consultas, a fim de identificá-los em SHOW PROCESSLIST ou mytop, gostaria de acrescentar uma coluna de nota para os meus resultados como:

$q = "SELECT '".__FILE__.'.'.__LINE__."' as _info, * FROM table ...";

Isso me mostrar o arquivo de emitir a consulta quando eu olhei para mytop, e isso não aconteceu folha do cache de consultas MySQL como usar

/* __FILE__.'.'.__LINE__ */ 

no início da minha consulta seria.

Suponho que outro par de coisas que eu posso fazer, no que respeita à questão da memória em geral, ao contrário especificamente para MySQL, e particularmente dentro do contexto de nosso próprio código personalizado, seria para embrulhar o nosso código com chamadas para um ou outra das seguintes PHP built-in funções:

memory_get_usage

memory_get_peak_usage

Em particular desde que eu estou trabalhando atualmente em login de algum código personalizado, eu posso registrar o uso da memória enquanto eu estou nele

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top