Status do Apache2 quando o servidor está sobrecarregado

3

Como posso verificar o status do apache2 quando ele está sobrecarregado? Ou seja, quando não responde às solicitações HTTP?

apache2ctl status é basicamente wget na página de status. Eu preciso de algo que funcione na linha de comando sem solicitar essa página.

    
por mossaab 26.11.2014 / 21:27

4 respostas

2

Estou ciente de dois métodos que você pode achar úteis:

1) mod_backdoor especifica um encadeamento especial e um soquete de escuta que permite que você acesse / server-status quando todos os encadeamentos normais estão amarrados (deve encontrá-lo facilmente em uma pesquisa na web)

link link

2) perl pode analisar o placar do apache se você permitir que ele use um placar no disco (ScoreBoardFile)

link

    
por 02.12.2014 / 01:58
0

Este é um dos casos em que o sistema de monitoramento adequado é remunerado. Ele teria reunido todas as estatísticas ao longo do tempo e mostraria as últimas estatísticas conhecidas mesmo quando o serviço for desativado. Sem mencionar a possibilidade de ser alertado quando seus pools de recursos começarem a ficar vazios, para que você possa agir antes que o serviço seja interrompido.

Quando o leite já foi derramado no chão, acho que o r_3 sugerido é uma boa solução.

    
por 27.11.2014 / 15:49
0

instale o sistema de monitoramento adequado ou brinque com o bash:

#!/bin/bash
# WTF APACHE???
# cpu count
CPU=$(cat /proc/cpuinfo | grep "^processor" | wc -l)
# load average count
LOAD_5=$(cat /proc/loadavg | awk '{print $2}')
LOAD_AVERAGE_5=$(($(echo ${LOAD_5} | awk '{print 100 * $1}') / ${CPU}))
# Red Alert : 85% high load 5 min
# send some mail with status
if [ ${LOAD_AVERAGE_5} -ge 85 ] ; then
        httpd status > /tmp/apache_status.log
        mail -s "APACHE STATUS" [email protected] < /tmp/apache_status.log
        service httpd stop
    else [ ${LOAD_AVERAGE_5} -le 50 ] ; then
        if ps aux | grep [h]ttpd; then echo 'OK'; else service httpd start; fi
fi
    
por 27.11.2014 / 18:54
0

Pergunta interessante, mas tenho certeza que você não pode. Uma solução alternativa pode estar matando alguns apache-threads e verifique se você é o primeiro a se conectar aos processos recém-gerados para mostrar o status do apache.

Edit: sim, vamos brincar com o bash

o seguinte funciona puxando o placar da sua página de status do servidor Apache e permitindo que você defina quando reagir.

Use a função _f_custom () para isso. Eu construí em dois exemplos:

  1. Se houver mais de 150 processos no modo Envio de resposta, você receberá um e-mail
  2. Se houver menos de 20 vagas abertas, envie também um email.

'

#!/bin/bash
_sleep="5"

_f_getfullstatus() {
    curl $_uri 2> /dev/null
}

_f_mailto() {
    ( echo -e "To:$1\nFrom:$1\nSubject:${2}:\n\n${3} ${4}" ; _f_getfullstatus ) | sendmail -t
}

_f_custom() {
    case "$1" in
            _)
            ;;
            S)
            ;;
            W)
            if [[ $2 -gt 150 ]] ; then _f_mailto $_email "Houson, we've got a problem" "Currently there are $2 processes in "sending reply" mode" ; fi
            ;;
            K)
            ;;
            D)
            ;;
            L)
            ;;
            G)
            ;;
            I)
            ;;
            .)
            if [[ $2 -lt 20 ]] ; then _f_mailto $_email "Running out of open slots" "there are only $2 available atm" ; fi
            ;;
    esac
}

_f_count() {
    for _status in _ S R W K D C L G I \.
            do
            _counter=$(echo $_auto_output | sed "s/[^$_status]//g" | wc -m)
            if [[ $_verbose == "yes" ]] ; then
                    echo -n "Status of key ${_status}:" 
                    echo $_counter
            fi
            _f_custom $_status $_counter
    done
}

while [[ $# > 0 ]] ; do
    _opt="$1"
    case $_opt in
            -u)
            shift
            _uri="$1"
            ;;
            -m)
            shift
            _email="$1"
            ;;
            -s)
            shift
            _sleep="$1"
            ;;
            -D)
            _daemon="yes"
            ;;
            -v)
            _verbose="yes"
            ;;
    esac
    shift
done

_auto_output=$(curl ${_uri}?auto 2> /dev/null | tail -1 | sed 's/Scoreboard: //g')

if [[ $_daemon == "yes" ]] ; then
    while true ; do
            _f_count
            sleep $_sleep
    done
else
    _f_count
fi

Isso precisa de sendmail e curl em $PATH

como --help não está implementado:

-u: URI to server-status page -m: sets a emailaddress to send your errors to -v: let it run verbosly -D: let it run in w while true loop (daemonize) -s: interval in seconds between status requests

    
por 27.11.2014 / 13:55

Tags