如何在 Linux 中获取 Apache 的“每秒请求数”?
Posted
技术标签:
【中文标题】如何在 Linux 中获取 Apache 的“每秒请求数”?【英文标题】:How to get "requests per second" for Apache in Linux? 【发布时间】:2010-09-25 14:58:12 【问题描述】:在 Windows for ASP 中,您可以获得 perfmon,但是...
如何在 Linux 中为 Apache 获取 “每秒请求数”?
【问题讨论】:
问题不清楚。您能否指定您要求的是实时日志还是历史日志? 【参考方案1】:综上所述,你可以使用mod_status和apachetop。
或者,您可以使用 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 命令的组合来快速获取此类统计信息的选项。
【讨论】:
【参考方案2】:我不喜欢我找到的任何解决方案,所以我自己写了。
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
【讨论】:
【参考方案3】:mod_status 就是其中之一!如果你调用它:
http://ip/server-status?refresh=1&auto-refresh=true
然后它每 2 秒自动刷新一次,因此您可以看到恒定的实时视图 :-)
【讨论】:
【参考方案4】:脚本显示不一致的数字。 -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
找到here。
【讨论】:
cut -c-2
有什么作用?那不就是剪掉行中的前两个字符吗?这似乎是错误的。我得到了 500+ 的数字,而 cut 给了我 11。【参考方案5】:
我编写了一组 Perl 脚本,显示过去 1、5 和 15 分钟的平均每秒请求数(如顶部)。在https://gist.github.com/1040144。
【讨论】:
【参考方案6】:这是我编写的一个简短的 bash 脚本,用于采样请求率(基于在日志文件中使用 wc -l
的 dicroce's suggestion)。
#!/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
【讨论】:
太棒了!谢谢!我想知道 wc -l 的性能如何。另一种方法是将日志文件通过管道传输到脚本的标准输入。因此,也可以添加 grep 以仅测量 .php 请求等。 在cmets部分,指定日志文件的选项应该是-l
而不是-i
【参考方案7】:
您可以在访问日志上使用“wc -l”来获取行数(大致对应于请求的数量...)每分钟执行一次并减去最后一个值以获得增量...
【讨论】:
【参考方案8】:实时,或者你可以使用mod_status?
显然,有一个版本的top for apache...
【讨论】:
提到的链接在 2009 年基于 web.archive.org 已失效,但它已针对此项目:github.com/nexcess/apachetop【参考方案9】:我认为 mod_status 可以做到...
http://httpd.apache.org/docs/2.0/mod/mod_status.html
您还可以使用 zenoss 通过社区 apache 插件从 mod_status 收集数据。
http://www.zenoss.com/
【讨论】:
以上是关于如何在 Linux 中获取 Apache 的“每秒请求数”?的主要内容,如果未能解决你的问题,请参考以下文章