23

在 Windows for ASP 中,您可以获得 perfmon,但是...

如何在 Linux 中获取 Apache 的“每秒请求数” ?

4

9 回答 9

27

这是我为采样请求率而编写的一个简短的 bash 脚本(基于dicrocewc -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
于 2009-12-11T22:03:43.013 回答
16

实时,或者你可以使用mod_status吗?

显然,有一个用于 apache 的 top版本......

于 2008-12-05T23:58:53.420 回答
13

总而言之,您可以使用mod_statusapachetop

或者,您可以使用 Adam Franco 和 Jon Daniel 的漂亮脚本来进行现场查看。

如果您想查看特定的日期和时间,可以发出以下小命令:

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

这里有一篇不错的文章,其中提供了更多关于使用 awk、cut 和 uniq 命令组合来快速获取此类统计信息的选项。

于 2014-10-29T13:50:49.677 回答
5

您可以在访问日志上使用'wc -l'来获取行数(大致对应于请求数......)每分钟执行一次并减去最后一个值以获得增量......

于 2008-12-06T00:11:16.487 回答
4

我不喜欢我找到的任何解决方案,所以我自己写了。

  • mod_status 不够准确。它基于服务器启动的时间,在我们的例子中通常是几个月。我正在寻找的是流量高峰。
  • 上面的 shell 脚本使用了一个不理想的 sleep() 语句,因为实际检索数据需要 x 秒。

所以这个解决方案在access_log 15000个请求前取了一个特定的行,并使用记录的时间与当前时间进行比较。

# 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
于 2014-08-26T12:34:22.737 回答
3

我认为 mod_status 可以做到...

http://httpd.apache.org/docs/2.0/mod/mod_status.html

您还可以使用 zenoss 使用社区 apache 插件从 mod_status 收集数据。

http://www.zenoss.com/

于 2008-12-05T23:58:45.653 回答
3

脚本显示不一致的数字。-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

在这里找到。

于 2011-09-19T10:55:50.497 回答
2

我编写了一组 Perl 脚本,显示过去 1、5 和 15 分钟的平均每秒请求数(如顶部)。它位于https://gist.github.com/1040144

于 2011-06-22T18:38:51.843 回答
1

mod_status 就是其中之一!如果你用以下方式调用它:

http://{ip}/server-status?refresh=1&auto-refresh=true

然后它每 2 秒自动刷新一次,因此您可以看到恒定的实时视图 :-)

于 2013-05-23T13:52:56.150 回答