Monitorando o LoadAvg e a Sobrecarga do Sistema com PHP

Artigo que apresenta uma função PHP para determinar o Load Average (Load AVG), ou carga do servidor, a fim de tratar uma possível sobrecarga do sistema antes que a situação fique crítica.

imagem cômica sobre sobrecarga

Uma características dos sistemas web de grande porte é o volume de usuários que trafegam por ele e realizam operações simultâneas. Nem sempre o servidor está preparado para suportar um volume de processamento tão alto, então, talvez seja útil implementar no seu sistema um mecanismo para medir o nível de processamento. No script abaixo, é mostrado um exemplo de como obter o Load AVG. A partir deste valor, podemos então emitir uma mensagem de alerta aos usuários, para prevenir que a situação se agrave ainda mais.

/**
 * Retorna o tamanho medio da fila de processos do ultimo minuto (system load average)
 * @return float valor medio do tamanho da fila de processos
 */ 
function get_load_avg() {

    // Tentar obter pela funcao sys_getloadavg
    if (function_exists('sys_getloadavg')) {
        $vt = sys_getloadavg();
        return $vt[0];
    }

    // Tentar obter executando o comando uptime na linha de comando
    exec('uptime', $linhas, $retorno);
    if ($retorno == 0) {
        $linha = array_shift($linhas);
        $str = 'load average:';
        $pos = strpos($linha, $str) + strlen($str);
        $tempos = trim(substr($linha, $pos));
        $vt = explode(',', $tempos);
        return (float)trim($vt[0]);
    }

    // Nao conseguiu obter o valor
    return 0;
}

Bom, agora é só verificar se o load avg passou de um determinado valor e emitir um erro 503 (serviço indisponível). Veja o exemplo:

define('MAX_LOAD_AVG', 5);

if (get_load_avg() > MAX_LOAD_AVG) {
    header('HTTP/1.1 503 Service Unavailable');
    header('Status: 503 Service Unavailable');
    header('Retry-After: 3600');
    header("Content-Type: text/html; charset=UTF-8");
    echo <<<HTML
<html>
<head>
<title>Sistema Indisponível</title>
</head>
<body>
  <h1>Sistema Indisponível</h1>
  <p>O servidor está operando acima do máximo permitido. Tente voltar mais tarde.</p>
</body>
</html>
HTML;
    exit(1);
}

// Codigo a ser executado normalmente
...

De acordo com a Wikipédia, se o valor do Load AVG está muito acima do número de processadores, então provavelmente ele está bem ocupado e devem existir muitos processos aguardando na fila de execução. Portanto, este valor máximo da constante MAX_LOAD_AVG deve ser configurada de acordo com as capacidades do servidor.

De fato, o script não reduz diretamente a carga do servidor. Porém, como apenas uma mensagem simples é emitida ao usuário, existe pouco processamento envolvido nisso. Neste sentido, se os usuários forem consciêntes de que não vai adiantar recarregar insistentemente a página, provavelmente a carga do servidor tende a baixar.

0 comentários