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

问题描述 投票:0回答:10

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

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

linux apache monitoring
10个回答
28
投票
这是我编写的一个简短的 bash 脚本,用于对请求率进行采样(基于

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
    

16
投票
实时,或者你可以使用

mod_status吗?

显然,有一个用于 apache 的

top 版本...


14
投票
总而言之,您可以使用

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

有一篇不错的文章

here提供了更多关于使用 awk、cut 和 uniq 命令组合来获取此类快速统计信息的选项。


5
投票
您可以在访问日志上使用“wc -l”来获取行数(大致相当于请求数...)每分钟执行一次,然后减去最后一个值以获得增量...


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

    mod_status 不够准确。它基于服务器的运行时间,在我们的例子中通常是几个月。我正在寻找的是流量峰值。
  • 上面的 shell 脚本使用 sleep() 语句,这并不理想,因为实际检索数据需要 x 秒。
因此,该解决方案在 15000 个请求之前的 access_log 中获取特定行,并使用记录的时间与当前时间进行比较。

# 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
    

3
投票
我认为 mod_status 可以做到...

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

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

http://www.zenoss.com/


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

找到

这里


2
投票
我编写了一组 Perl 脚本,显示过去 1 分钟、5 分钟和 15 分钟的平均每秒请求数(如顶部)。它位于

https://gist.github.com/1040144 .


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

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

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


0
投票
是否有人希望获取特定 API 端点的 Apache 访问日志中每秒

每秒的请求数列表(而不是@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}'
    
© www.soinside.com 2019 - 2024. All rights reserved.