まったり技術ブログ

Webエンジニアのセキュリティブログ

Webサーバベンチマークツール『weighttp』をさわってみる

はじめに

 Webサーバのベンチマークツールである"weighttp"のインストール・動作確認までを行っていきます。
私の環境ではPythonのバージョン3がデフォルトして動作しており、それが原因でつまずいた点がありましたので、記載しておきます。

github.com

導入

configure 実施

$ yum install -y --enablerepo=epel libev libev-devel
$ wget http://github.com/lighttpd/weighttp/zipball/master
$ unzip master
$ cd lighttpd-weighttp-f680bec/

configure 実行(失敗: Python3で動かしたことが原因)

$ ./waf configure
Checking for program gcc,cc              : ok /usr/bin/gcc
Checking for program cpp                 : ok /usr/bin/cpp
Checking for program ar                  : ok /usr/bin/ar
Checking for program ranlib              : ok /usr/bin/ranlib
Checking for gcc                         : ok
Checking for library ev                  : ok
Traceback (most recent call last):
  File "/tmp/weighttp-master/.waf3-1.5.9-d1e0349fc8937631a656fb8ea7e99063/wafadmin/Utils.py", line 414, in recurse
    txt=readf(base+'_'+name,m='rU')
  File "/tmp/weighttp-master/.waf3-1.5.9-d1e0349fc8937631a656fb8ea7e99063/wafadmin/Utils.py", line 379, in readf
    f=open(fname,m)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/weighttp-master/wscript_configure'

 "FileNotFoundError"が発生している。下のサイトで解決することができた。 バージョン2のPythonを使用すればいいらしい。

[solved] Can't Compile Hamster (Python app) / Applications & Desktop Environments / Arch Linux Forums

configure 実行(2度目の失敗: ev.hが見つからなかった)

$ python2 ./waf configure

Checking for program gcc,cc              : ok /usr/bin/gcc
Checking for program cpp                 : ok /usr/bin/cpp
Checking for program ar                  : ok /usr/bin/ar
Checking for program ranlib              : ok /usr/bin/ranlib
Checking for gcc                         : ok
Checking for library ev                  : ok
Checking for header ev.h                 : not found
 error: the configuration failed (see '/tmp/weighttp-master/build/config.log')

Checking for header ev.h : not found」と出力されているので、ヘッダファイルを移動させます。

ヘッダファイル"ev.h"を移動

$ cp /usr/include/libev/ev.h /usr/include/

configure 実行(成功!!)

$ python2 ./waf configure

Checking for program gcc,cc              : ok /usr/bin/gcc
Checking for program cpp                 : ok /usr/bin/cpp
Checking for program ar                  : ok /usr/bin/ar
Checking for program ranlib              : ok /usr/bin/ranlib
Checking for gcc                         : ok
Checking for library ev                  : ok
Checking for header ev.h                 : ok
Checking for library pthread             : ok
Checking for header pthread.h            : ok
Checking for header unistd.h             : ok
Checking for header stdint.h             : ok
Checking for header fcntl.h              : ok
Checking for header inttypes.h           : ok
'configure' finished successfully (0.481s)

ビルド

$ python2 ./waf build

Waf: Entering directory `/tmp/weighttp-master/build'
[1/4] cc: src/client.c -> build/default/src/client_1.o
[2/4] cc: src/weighttp.c -> build/default/src/weighttp_1.o
[3/4] cc: src/worker.c -> build/default/src/worker_1.o
[4/4] cc_link: build/default/src/client_1.o build/default/src/weighttp_1.o build/default/src/worker_1.o -> build/default/weighttp
Waf: Leaving directory `/tmp/weighttp-master/build'
'build' finished successfully (0.754s)

インストール

$ python2 ./waf install

Waf: Entering directory `/tmp/weighttp-master/build'
* installing build/default/weighttp as /usr/local/bin/weighttp
Waf: Leaving directory `/tmp/weighttp-master/build'
'install' finished successfully (0.007s)

「weighttp」コマンドの動作確認

 これで weighttpコマンドを利用することができるようになりました。
試しにヘルプコマンドを実行してみます。

$ weighttp --help
weighttp 0.4 - a lightweight and simple webserver benchmarking tool

error: unkown option: --

weighttp <options> <url>
  -n num   number of requests    (mandatory)
  -t num   threadcount           (default: 1)
  -c num   concurrent clients    (default: 1)
  -k       keep alive            (default: no)
  -6       use ipv6              (default: no)
  -H str   add header to request
  -h       show help and exit
  -v       show version and exit

example: weighttpd -n 10000 -c 10 -t 2 -k -H "User-Agent: foo" localhost/index.html

「weighttp」コマンドでベンチマーク取得

 helpコマンドで出力されたコマンド例通りに動かしてみます。

$ weighttp -n 10000 -c 10 -t 2 -k -H "User-Agent: foo" localhost/index.php

weighttp 0.4 - a lightweight and simple webserver benchmarking tool

starting benchmark...
spawning thread #1: 5 concurrent requests, 5000 total requests
spawning thread #2: 5 concurrent requests, 5000 total requests
progress:  10% done
progress:  20% done
progress:  30% done
progress:  40% done
progress:  50% done
progress:  60% done
progress:  70% done
progress:  80% done
progress:  90% done
progress: 100% done

finished in 5 sec, 34 millisec and 237 microsec, 1986 req/s, 387 kbyte/s
requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored
status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 2000000 bytes total, 1920000 bytes http, 80000 bytes data

 Webサーバログにも通信ログが残っておりしっかりとベンチマークを取得できていそう。
今までのは"Apache Bench"を使っていましたが、"weighttp"が代替ツールになるかこれからいろいろ検証していく予定。