2008-12-05 14 views

Respuesta

16

En tiempo real, o se puede utilizar mod_status?

Y al parecer, hay una versión de top for apache ...

+8

El enlace mencionado parece estar apuntando a una ubicación no válida ... –

5

puede utilizar 'wc -l' en el registro de acceso para obtener el número de líneas (que corresponde aproximadamente a la cantidad de solicitudes ...) Haga eso cada minuto y reste el último valor para obtener el delta ...

22

Aquí hay un script bash corto que hice para muestrear la tasa de solicitud (basado en dicroce's suggestion de usar wc -l en el archivo de registro).

#!/bin/sh 

############################################################################## 
# This script will monitor the number of lines in a log file to determine the 
# number of requests per second. 
# 
# Example usage: 
# reqs-per-sec -f 15 -i /var/www/http/access.log 
# 
# Author: Adam Franco 
# Date: 2009-12-11 
# License: http://www.gnu.org/copyleft/gpl.html GNU General Public License (GPL) 
############################################################################## 

usage="Usage: `basename $0` -f <frequency in seconds, min 1, default 60> -l <log file>" 

# Set up options 
while getopts ":l:f:" options; do 
case $options in 
l) logFile=$OPTARG;; 
f) frequency=$OPTARG;; 
\?) echo -e $usage 
    exit 1;; 
*) echo -e $usage 
    exit 1;; 

esac 
done 

# Test for logFile 
if [ ! -n "$logFile" ] 
then 
echo -e $usage 
exit 1 
fi 

# Test for frequency 
if [ ! -n "$frequency" ] 
then 
frequency=60 
fi 

# Test that frequency is an integer 
if [ $frequency -eq $frequency 2> /dev/null ] 
then 
: 
else 
echo -e $usage 
exit 3 
fi 

# Test that frequency is an integer 
if [ $frequency -lt 1 ] 
then 
echo -e $usage 
exit 3 
fi 

if [ ! -e "$logFile" ] 
then 
echo "$logFile does not exist." 
echo 
echo -e $usage 
exit 2 
fi 

lastCount=`wc -l $logFile | sed 's/\([0-9]*\).*/\1/'` 
while true 
do 
newCount=`wc -l $logFile | sed 's/\([0-9]*\).*/\1/'` 
diff=$((newCount - lastCount)) 
rate=$(echo "$diff/$frequency" |bc -l) 
echo $rate 
lastCount=$newCount 
sleep $frequency 
done 
+0

Este script es realmente increíble, gracias por publicarlo. –

+0

¡Genial! ¡Gracias! Me pregunto cómo es el rendimiento de wc -l. Otro enfoque sería la posibilidad de canalizar el archivo de registro a stdin del script. Por lo tanto, grep también podría agregarse a las solicitudes de medición solo .php y así sucesivamente. – Alex

+0

En la sección de comentarios, la opción para especificar el archivo de registro debe ser '-l' en lugar de' -i' – Victor

2

I escribió un conjunto de scripts de Perl que muestran las peticiones por segundo promedio de los últimos 1, 5 y 15 minutos (como arriba). Está en https://gist.github.com/1040144.

3

La secuencia de comandos muestra números inconsistentes. -f ¡El parámetro afecta mucho a la salida! y la primera lectura tampoco es precisa.

Terminé usando:

while true; do tail -n0 -f access.log>/tmp/tmp.log & sleep 2; kill $! ; wc -l /tmp/tmp.log | cut -c-2; done 2>/dev/null 

Encontrado here.

+1

y el script anterior tampoco fue muy bueno ...: p – xztraz

+0

¿Qué hace 'cut -c-2' do ? ¿No es eso solo cortar a los dos primeros personajes en la línea? Eso parece incorrecto Estoy recibiendo números como 500+ y el corte me da 11. – chovy

1

¡mod_status es el indicado! si se llama con:

http: // {IP}/server-status refrescar = 1 & actualización automática = true

Luego se auto actualiza cada 2 segundos para que pueda ver una vista en tiempo real constante :-)

3

No me gustaron ninguna de las soluciones que encontré, así que escribí la mía.

  • mod_status no es lo suficientemente preciso. Se basa en la duración del servidor, que en nuestro caso suele ser de meses. Lo que busco son picos de tráfico.
  • el script de shell anterior usa una sentencia sleep() que no es ideal, ya que toma x segundos recuperar realmente los datos.

Así que esta solución tiene una línea particular en el access_log hace 15000 peticiones, y utiliza el tiempo registrado para comparar con la hora actual.

# This check is needed because if the logs have just rolled over, then we need a minimum 
# amount of data to report on. 
# You will probably need to adjust the 3500000 - this is roughly the file size when the 
# log file hits 15000 requests. 
FILESIZE=`ls -l /var/log/httpd/access_log | awk '{print $5}' ` 
if [ $FILESIZE -le 3500000 ] 
then 
     # not enough data - log file has rolled over 
     echo "APACHE_RPS|0" 
else 
     # Based on 15000 requests. Depending on the location of the date field in 
     # your apache log file you may need to adjust the ...substr($5... bit 
     LASTTIME=`tail -15000 /var/log/httpd/access_log | head -1 | awk '{printf("%s\n",substr($5,2,20));}' ` 
     APACHE_RPS=`echo $LASTTIME | gawk -vREQUESTS=15000 ' { 
       # convert apache datestring into time format accepted by mktime(); 
       monthstr = substr($0,4,3); 
       if(monthstr == "Jan"){ monthint = "01"; } 
       if(monthstr == "Feb"){ monthint = "02"; } 
       if(monthstr == "Mar"){ monthint = "03"; } 
       if(monthstr == "Apr"){ monthint = "04"; } 
       if(monthstr == "May"){ monthint = "05"; } 
       if(monthstr == "Jun"){ monthint = "06"; } 
       if(monthstr == "Jul"){ monthint = "07"; } 
       if(monthstr == "Aug"){ monthint = "08"; } 
       if(monthstr == "Sep"){ monthint = "09"; } 
       if(monthstr == "Oct"){ monthint = "10"; } 
       if(monthstr == "Nov"){ monthint = "11"; } 
       if(monthstr == "Dec"){ monthint = "12"; } 
       mktimeformat=sprintf("%s %s %s %s %s %s [DST]\n", substr($0,8,4), monthint, substr($0,1,2), substr($0, 13,2), substr($0, 16,2), substr($0, 19,2)); 
       # calculate difference 
       difference = systime() - mktime(mktimeformat); 
       # printf("%s - %s = %s\n",systime(), mktime(mktimeformat), difference); 
       printf("%s\n",REQUESTS/difference); 
     } ' ` 

     echo "APACHE_RPS|${APACHE_RPS}" 
fi 
8

Para resumir, se puede utilizar mod_status y apachetop.

Alternativamente, puede utilizar los buenos guiones de Adam Franco y Jon Daniel para tener una apariencia en vivo.

Si desea echar un vistazo a una fecha partiular y hora, puede emitir este pequeño comando:

grep "29/Oct/2014:12" /var/log/apache2/example.com.log | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":"$3}' | sort -nk1 -nk2 | uniq -c | awk '{ if ($1 > 10) print $0}' 

Reemplazar con la fecha y hora que usted está interesado y también con el pathfilename adecuada de la archivo de registro.

Será imprimir algo como:

1913 12:47 
226 12:48 
554 12:49 
918 12:50 

Hay un buen artículo here con más opciones sobre el uso de una combinación de awk, corte y manda uniq para obtener estadísticas rápida de la clase.

Cuestiones relacionadas