在Windows for ASP中,你可以获得perfmon,但是...
如何在 Linux 中获取 Apache 的 “每秒请求数”?
dicroce 的建议,即在日志文件上使用 wc -l
)。
#!/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
如果您想查看特定的日期和时间,您可以发出这个小命令:
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}'
替换为您感兴趣的日期和时间,以及日志文件的正确路径文件名。
它会打印出类似的内容:
1913 12:47
226 12:48
554 12:49
918 12:50
有一篇不错的文章
# 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
-f
参数对输出影响很大!而且初读也不准确。我最终使用了:
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
找到
这里。
https://gist.github.com/1040144 .
http://{ip}/server-status?refresh=1&auto-refresh=true
然后它每 2 秒自动刷新一次,这样您就可以看到恒定的实时视图:-)
每秒的请求数列表(而不是@Wtower
中提供的每分钟
的请求数)的答案),这是一个迷人的一句台词:
grep "api/v1" /var/log/apache2/access.log | \
cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":"$3":"$4}' | awk -F' ' '{print $1}' | \
sort -t':' -nk1 -nk2 -nk3 | uniq -c | awk '{ if ($1 > 1) print $0}'