web-dev-qa-db-ja.com

LinuxでApacheの「1秒あたりのリクエスト数」を取得する方法

Windows for ASPでは、perfmonを取得できますが...

LinuxのApacheで"requests per second"を取得する方法は?

22
Daniel Silveira

リアルタイムで、または mod_status を使用できますか?

そしてどうやら Apacheのトップ ...のバージョンがあります。

16
Gunny

これは、リクエストレートをサンプリングするために作成した短いbashスクリプトです(ログファイルでwc -lを使用した場合の dicroceの提案 に基づいています)。

#!/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
26
Adam Franco

要約すると、 mod_status および apachetop を使用できます。

または、Adam FrancoとJon DanielのNiceスクリプトを使用して、ライブの外観を作成することもできます。

特定の日付と時間を確認したい場合は、次の小さなコマンドを発行できます。

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コマンドの組み合わせを使用して、種類の統計をすばやく取得するためのオプションがさらにあります。

12
Wtower

アクセスログで 'wc -l'を使用して、行数を取得できます(これは、要求の数にほぼ対応します...)毎分それを行い、最後の値を差し引いて、デルタを取得します...

5
dicroce

見つけた解決策はどれも気に入らなかったので、自分で作成しました。

  • mod_statusは十分に正確ではありません。これは、サーバーが稼働している時間に基づいており、通常は数か月です。私が探しているのは、トラフィックのスパイクです。
  • 上記のシェルスクリプトでは、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
4
Jon Daniel

Mod_statusならできると思います...

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

Zenossを使用して、コミュニティApacheプラグインを使用してmod_statusからデータを収集することもできます。

http://www.zenoss.com/

3
benlumley

スクリプトに一貫性のない数値が表示されます。 -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

見つかりました ここ

3
xztraz

過去1、5、15分間の1秒あたりの平均リクエスト数を表示する一連のPerlスクリプトを作成しました(topのように)。 https://Gist.github.com/1040144 にあります。

2

mod_statusがその1つです。あなたがそれを呼び出す場合:

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

その後、2秒ごとに自動更新されるため、一定のリアルタイムビューを確認できます:-)

1
psf