Pedido PHP às vezes muito lento

2

Eu tenho um script PHP / Mysql em execução em um servidor apache / php4 (o php4 é apenas temporário, até que um novo servidor esteja pronto ...), e notei um comportamento estranho.

Solicitações, que usam algumas consultas PHP mysql, geralmente são muito rápidas. Mas se eu enviar o mesmo pedido para o servidor 10 vezes (um após o outro, sem carga pesada a todos) talvez 8-9 vezes ele irá terminar dentro de 50ms. Mas uma ou duas das solicitações levarão mais de 5 segundos cada. Nada entre, apenas ~ 50ms ou vários segundos.

Parece muito aleatório (não o primeiro pedido lento e o seguinte rápido ou algo assim) e não consigo encontrar o motivo.

Alguém tem uma ideia do que pode causar esse problema e como corrigi-lo?

    
por Ruu 30.05.2011 / 17:47

2 respostas

1

É difícil identificar a causa exata de um servidor de desempenho lento a partir de apenas uma breve descrição, você vai querer fazer alguns benchmarking para direcionar a causa da desaceleração. Por exemplo ...

  1. Pode ser a configuração do apache (os clientes máximos podem ser configurados para um número baixo realmente - no entanto, isso é duvidoso). Tente o benchmark do apache (ab)

  2. Poderiam ser consultas MySQL mal construídas causando bloqueios de tabela (dependendo do seu mecanismo de armazenamento para cada tabela acessada) ou o limite de conexão do MySQL sendo realmente baixo (verifique isto )

  3. Pode ser que seus scripts PHP sejam realmente intensos e seu servidor simplesmente não tenha o hardware para suportar esse nível de atividade.

  4. EDIT: Dê uma olhada no munin que lhe dará uma visão abrangente do desempenho do seu servidor, então monitore-o como você faz os pedidos.

É tudo muito subjetivo. Talvez outra pessoa possa apontar outros problemas em potencial.

    
por 30.05.2011 / 17:57
0

Como outros apontam, pode ser difícil identificar o problema. No entanto, você pode verificar a execução do script. Se o problema for visível para o PHP, provavelmente será entre o PHP ou o banco de dados.

Você poderia fazer uma verificação de execução no script fazendo algo como:

function checkpoint(){
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   return $mtime;
}

function measureGaps($data){
    $size = count($data);
    for($i=0; $i < $size - 1; $i++){
      $p = $i+1;
      $gap[]= $data[$p] - $data[$i];
     }
    return $gap;
}

Em cada ponto de verificação, você pode fazer:

$checkpointArray[] = checkpoint();

No final do script, chame a outra função:

var_dump(measureGaps($checkpointArray));

Se você não quiser fazer um var_dump, altere a saída para gravar em um arquivo.

    
por 05.06.2011 / 01:01