如何在 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 的“每秒请求数”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中获取每秒的 GPU 使用率

7种Linux中获取CPU速度的方法

如何在linux下安装ssl证书?

linux下如何使用命令行查看apache日志?

根据apache访问日志怎么计算出每秒的并发数

获取apache ignite缓存中的数据行数少于实际行数