Por que o tempo necessário para executar esse script difere muito entre usuário e sistema e como eu posso corrigir a discrepância?

2

Meu aplicativo fica atrás de um balanceador de carga e, de vez em quando, gosto de fazer uma verificação de status em cada máquina para ter uma idéia do tempo necessário para retornar um documento index.html em cada máquina.

O script é assim:

   for host in 192.168.0.7 192.168.0.8 192.168.0.9; do
      result=$( ( time wget -q --header="Host: domain.tomonitor.com" http://$host/ ) 2>&1 | grep real | awk '{print $2}' )
      date=$(date)
      echo "$date, $host, $result"
   done

Como o aplicativo acha que está em domain.tomonitor.com , defino isso manualmente no cabeçalho da solicitação do wget. É grep s para o tempo "real" e awk s apenas para o tempo, despejando isso em uma variável $ result. Empiricamente, parece funcionar muito bem como uma verificação manual básica - as respostas normalmente levam de 2 a 3 segundos pelos meus vários servidores, a menos que haja conexões desequilibradas acontecendo. Eu o executo diretamente do meu laptop Mac OS X em nossa rede privada.

Outro dia eu me perguntei se eu poderia registrar os resultados ao longo do tempo usando um cron. Fiquei espantado ao descobrir que tinha respostas de subsegundos, por exemplo, 0,003 segundos. Tentei montar os resultados do script na minha área de trabalho com um widget da área de trabalho do OS X chamado Geektool e vi tempos de sub-segundo semelhantes relatados.

Eu suspeito que a diferença é devido a algum erro do usuário - alguma razão pela qual o comando time wget que estou executando não funcionará. Alguém pode me dizer por que o tempo que leva para executar este script é muito diferente entre o usuário (eu executando manualmente) e o sistema (cronjob ou Geektool) e como eu posso corrigir a discrepância?

    
por editor 15.02.2011 / 00:57

1 resposta

3

Você não mostra sua linha de shebang, mas com base no que você está procurando, eu diria que você está executando isso em Bash. Se você não tiver uma linha shebang, você deve adicionar uma. O shell Bourne não possui um comando time embutido, portanto, ele usará /usr/bin/time , que tem um formato de saída diferente do time embutido no Bash.

Como você está usando o Bash, é possível definir o formato de saída do comando time usando a variável TIMEFORMAT , para não precisar usar grep e awk . Eu usaria chaves para evitar qualquer sobrecarga que a criação de um sub-shell pudesse adicionar.

#!/bin/bash
TIMEFORMAT=%R
for host in 192.168.0.7 192.168.0.8 192.168.0.9; do
    result=$( { time wget -q --header="Host: domain.tomonitor.com" http://$host/; } 2>&1 )
    date=$(date)
    echo "$date, $host, $result"
done

Eu não estou familiarizado com o Geektool, então não sei como isso afeta seus resultados. No entanto, as alterações acima podem fazer o script funcionar de forma mais consistente entre os ambientes. Você já pensou se a conectividade é simplesmente muito melhor para o servidor?

Outra coisa a verificar é ver se você está recebendo a resposta esperada para o comando wget . Às vezes, pequenas vezes indicam que você está recebendo um erro. A execução do script em cron pode enviar o erro por e-mail, mas você pode registrá-lo fazendo a seguinte alteração:

    result=$( { time wget -q --header="Host: domain.tomonitor.com" http://$host/ >/tmp/wget.$$.out 2>&1; } 2>&1 )

, que colocará as mensagens de saída e erro de wget em um arquivo chamado "/tmp/wget.PID.out", onde "PID" é um ID numérico do processo. A saída de time ainda irá para a variável.

    
por 15.02.2011 / 02:56