LoginSignup
2
3

More than 5 years have passed since last update.

python FunkLoad で WEBの負荷テスト

Last updated at Posted at 2018-09-16

python FunkLoad で WEBの負荷テストする備忘録メモ

負荷テストといえばJMeterやApache Benchあたりが有名。
ただしJMeterはちょっとリッチで面倒くさそう。
Apache Benchはシンプルだがシナリオがつくれない。
そこでPythonベースでシンプルでシナリオありの負荷試験を簡易的に行えるFunkLoadに出会う。
コンフィグファイルと、数行のpythonテストプログラムを2つ用意するだけでOK。
インストールもpipで一発。

参考

[1] Funk Loadインストール

Amazon-Linuxはpipで入れる

pip install funkload

[2] テスト用ファイルの準備

準備するのは、負荷試験設定のconfigファイルと、処理内容のpythonのみ

Simple.conf

[main]
title=Simple FunkLoad tests
description = Simple demo
# 宛先
url = http://localhost:80


[test_simple]
description = Access our Demo app

[ftest]
log_to = console file
log_path = ./output/Simple-test.log
result_path = ./output/simple-test.xml
sleep_time_min = 0
sleep_time_max = 0

[bench]
# 各テストケース(=サイクル)のユーザ数。下記はケース1:1人、ケース2:5人、・・・
cycles = 1:5:10
# 各サイクルの期間(秒)。
duration = 10
# スレッド開始までのwait(秒)
startup_delay = 0
# テスト実行間のwait(テストリクエスト発行間隔)(秒)
sleep_time = 1
# 各サイクル間のwait
cycle_time = 5

# ログ設定
log_to =
log_path = ./output/simple-bench.log
result_path = ./output/simple-bench.xml
# テスト実行間のMAX/MIN wait(テストリクエスト発行間隔)(秒)
sleep_time_min = 0
sleep_time_max = 0

test_Simple.py
※単純に「トップ画面で200 OKならよい」というテストシナリオ

import unittest
from random import random
from funkload.FunkLoadTestCase import FunkLoadTestCase

class Simple(FunkLoadTestCase):

    def setUp(self):
        self.server_url = self.conf_get('main', 'url')


    def test_simple(self):
        #ここがテストシナリオ。例では1リクエストのみだが、複数処理書いてもよい。
        server_url = self.server_url
        res = self.get(server_url, description='Get url')
        self.assertEqual(res.code, 200)

if __name__ in ('main', '__main__'):
    unittest.main()

[3] サンプルWEBサイト準備

今回は簡単にdockerでnginxのサイトを立てる

docker run -p 80:80 nginx:latest

※docker installなどは省略

[4] テスト実行

コマンド

fl-run-bench test_Simple.py Simple.test_simple

こんな感じで結果が標準出力

========================================================================
Benching Simple.test_simple
========================================================================
Access our Demo app
------------------------------------------------------------------------

Configuration
=============

* Current time: 2018-09-16T06:23:52.054577
* Configuration file: ~/Simple.conf
* Log xml: ~/output/simple-bench.xml
* Server: http://localhost:80
* Cycles: [1, 5, 10]
* Cycle duration: 10s
* Sleeptime between request: from 0.0s to 0.0s
* Sleeptime between test case: 1.0s
* Startup delay between thread: 0.0s

Benching
========

* setUpBench hook: ... done.

Cycle #0 with 1 virtual users
-----------------------------

* setUpCycle hook: ... done.
* Current time: 2018-09-16T06:23:52.055426
* Starting threads: . done.
* Logging for 10s (until 2018-09-16T06:24:02.056792): .......... done.
* Waiting end of threads: . done.
* Waiting cycle sleeptime 5s: ... done.
* tearDownCycle hook: ... done.
* End of cycle, 15.04s elapsed.
* Cycle result: **SUCCESSFUL**, 10 success, 0 failure, 0 errors.

Cycle #1 with 5 virtual users
-----------------------------

* setUpCycle hook: ... done.
* Current time: 2018-09-16T06:24:07.093412
* Starting threads: ..... done.
* Logging for 10s (until 2018-09-16T06:24:17.103725): .................................................. done.
* Waiting end of threads: ..... done.
* Waiting cycle sleeptime 5s: ... done.
* tearDownCycle hook: ... done.
* End of cycle, 15.06s elapsed.
* Cycle result: **SUCCESSFUL**, 50 success, 0 failure, 0 errors.

Cycle #2 with 10 virtual users
------------------------------

* setUpCycle hook: ... done.
* Current time: 2018-09-16T06:24:22.156211
* Starting threads: ................. done.
* Logging for 10s (until 2018-09-16T06:24:32.190575): ............................................................................................. done.
* Waiting end of threads: ........... done.
* Waiting cycle sleeptime 5s: ... done.
* tearDownCycle hook: ... done.
* End of cycle, 16.05s elapsed.
* Cycle result: **SUCCESSFUL**, 93 success, 0 failure, 0 errors.

* tearDownBench hook: ... done.

Result
======

* Success: 153
* Failures: 0
* Errors: 0

Bench status: **SUCCESSFUL**

[5] 実行結果確認

さっき立てたnginxのaccess.logを確認してみる
access.logは、/etc/nginx/nginx.confでチェック

1st cycleで1sおきに10回、その後5sあけて2nd cycleが5 userから・・・と実際にリクエストを受けていることがわかる。

172.17.0.1 - - [16/Sep/2018:06:23:52 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:23:53 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:23:54 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:23:55 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:23:56 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:23:57 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:23:58 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:23:59 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:00 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:01 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:07 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:07 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:07 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:07 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:07 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:08 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:08 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:08 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:08 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
172.17.0.1 - - [16/Sep/2018:06:24:08 +0000] "GET / HTTP/1.0" 200 612 "-" "FunkLoad/1.17.1" "-"
:
(以下省略)

[6] 実行結果をもっと詳しくチェック

実行結果で出力されるxmlを引数に以下を実行すると、htmlレポートを生成できる

fl-build-report --html simple-bench.xml

report.png

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3