Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
42
Help us understand the problem. What is going on with this article?
@morikat

Go言語のhttp負荷テストツールVegetaを使ってBlueMixを試す

More than 5 years have passed since last update.

Go言語のhttp負荷テストツールVegetaを使ってBlueMixを試す

Vegetaとは

Go言語で書かれているhttpの負荷テストツールです。
github上で公開されており、README.mdにこのツールの名称が何を指しているのかが分かりやすく描かれています。
個人的には負荷のかけ方が『vegeta attack』というコマンドを使う所に惹かれました

Vegetaの入手の仕方

gitがclone出来る状態でGVM等を使ってGoをインストールしていれば
以下のコマンドで利用可能になります。

$ go get github.com/tsenart/vegeta
$ go install github.com/tsenart/vegeta

今回はローカルの場所にユーザの領域部分(sudoが不要な場所)にセットアップしていきます。

GOPATHの設定

$ mkdir http-load-test
$ cd http-load-test
$ export GOPATH=$PWD

vegetaをhttp-load-testのは以下に落とす

以下のコマンドを実行するとbinの下にvegetaというファイルが出来ます

$ go get github.com/tsenart/vegeta
$ ls bin/
vegeta
$ cd bin/

Vegetaの基本的な使い方

以下のように記述すると動作します

$ echo "GET http://localhost/" | ./vegeta attack -rate=100 -duration=5s | ./vegeta report

『echo』部分でリクエストのURL
『vegeta attack』部分で『-rate=100』で秒間100リクエストを『-duration=5s』で5秒間行います。
『vegeta report』で実行した結果を画面に出力します

BlueMix(Cloud Foundry v2環境)へアプリをpush

今回はCFの上で動く簡単なアプリが入っているcf-acceptance-testsのasstesの中にあるdoraというアプリを使ってみます

cf-acceptance-testsのcloneしdoraをBlueMixへpush

$ git clone https://github.com/pivotal-cf-experimental/cf-acceptance-tests.git
$ cd cf-acceptance-tests/assets/dora/
$ cf push cf-dora -i 1 -m 128m

途中のログは省略..

requested state: started
instances: 1/1
usage: 128M x 1 instances
urls: cf-dora.ng.bluemix.net

     state     since                    cpu    memory          disk
#0   running   2014-03-01 05:00:05 PM   0.0%   17.7M of 128M   60.6M of 1G

『-i 1』でインスタンス1を指定し
『-m 1』で1インスタンスアプリあたりに128mメモリを割り当てています

curlコマンドで確認してみます

$ curl http://cf-dora.ng.bluemix.net/
Hi, I'm Dora!

vegetaを使ってアクセス(doraのインスタンスは1)

秒間100リクエストを5秒間

$ echo "GET http://cf-dora.ng.bluemix.net/" | ./vegeta attack -rate=100 -duration=5s | ./vegeta report
2014/03/01 17:09:18 Vegeta is attacking 1 targets in random order for 5s...
2014/03/01 17:09:25 Done!
2014/03/01 17:09:25 Writing results to 'stdout'...
Requests        [total]                         500
Duration        [total]                         4.990176005s
Latencies       [mean, 50, 95, 99, max]         437.373852ms, 403.273227ms, 896.467786ms, 1.717192664s, 1.717192664s
Bytes In        [total, mean]                   6500, 13.00
Bytes Out       [total, mean]                   0, 0.00
Success         [ratio]                         100.00%
Status Codes    [code:count]                    200:500
Error Set:

秒間200リクエストを5秒間

$ echo "GET http://cf-dora.ng.bluemix.net/" | ./vegeta attack -rate=200 -duration=5s | ./vegeta report
2014/03/01 17:10:33 Vegeta is attacking 1 targets in random order for 5s...
2014/03/01 17:10:39 Done!
2014/03/01 17:10:39 Writing results to 'stdout'...
Requests        [total]                         1000
Duration        [total]                         4.994420753s
Latencies       [mean, 50, 95, 99, max]         351.303528ms, 318.704129ms, 530.301522ms, 903.208726ms, 903.208726ms
Bytes In        [total, mean]                   13000, 13.00
Bytes Out       [total, mean]                   0, 0.00
Success         [ratio]                         100.00%
Status Codes    [code:count]                    200:1000
Error Set:

秒間250リクエストを5秒間

$ echo "GET http://cf-dora.ng.bluemix.net/" | ./vegeta attack -rate=250 -duration=5s | ./vegeta report
2014/03/01 17:14:52 Vegeta is attacking 1 targets in random order for 5s...
2014/03/01 17:15:05 Done!
2014/03/01 17:15:05 Writing results to 'stdout'...
Requests        [total]                         1250
Duration        [total]                         4.99517956s
Latencies       [mean, 50, 95, 99, max]         3.614812498s, 3.673411212s, 6.336981528s, 6.496029661s, 6.826508395s
Bytes In        [total, mean]                   13559, 10.85
Bytes Out       [total, mean]                   0, 0.00
Success         [ratio]                         83.44%
Status Codes    [code:count]                    200:1043  0:207
Error Set:
Get http://cf-dora.ng.bluemix.net/: dial tcp 75.126.70.44:80: too many open files

200以外がちらほら出てくる

vegetaを使ってアクセス(doraのインスタンスは2)

まずはじめにcfコマンドを使って『dora』のインスタンス数を2にします

$ cf scale cf-dora -i 2
Scaling app cf-dora in org hogehoge@hogehoge.com/ space dev as hogehoge@hogehoge.com...
OK

再度秒間250リクエストを5秒間

$ echo "GET http://cf-dora.ng.bluemix.net/" | ./vegeta attack -rate=250 -duration=5s | ./vegeta report
2014/03/01 17:21:42 Vegeta is attacking 1 targets in random order for 5s...
2014/03/01 17:21:49 Done!
2014/03/01 17:21:49 Writing results to 'stdout'...
Requests        [total]                         1250
Duration        [total]                         4.99567373s
Latencies       [mean, 50, 95, 99, max]         1.129867175s, 1.202581072s, 1.893686575s, 3.58801983s, 3.58801983s
Bytes In        [total, mean]                   13858, 11.09
Bytes Out       [total, mean]                   0, 0.00
Success         [ratio]                         85.28%
Status Codes    [code:count]                    200:1066  0:184
Error Set:
Get http://cf-dora.ng.bluemix.net/: dial tcp 75.126.70.44:80: too many open files

今度は1インスタンスに戻し秒間250リクエストを1秒間にして確認

cfコマンドを使って『dora』のインスタンス数を1にします

$ cf scale cf-dora -i 1
Scaling app cf-dora in org hogehoge@hogehoge.com/ space dev as hogehoge@hogehoge.com...
OK

秒間1000リクエストを1秒間

$ echo "GET http://cf-dora.ng.bluemix.net/" | ./vegeta attack -rate=1000 -duration=1s | ./vegeta report
2014/03/01 17:34:20 Vegeta is attacking 1 targets in random order for 1s...
2014/03/01 17:34:25 Done!
2014/03/01 17:34:25 Writing results to 'stdout'...
Requests        [total]                         1000
Duration        [total]                         1.045985158s
Latencies       [mean, 50, 95, 99, max]         1.988395448s, 1.97215095s, 3.519185002s, 4.821988844s, 4.821988844s
Bytes In        [total, mean]                   13000, 13.00
Bytes Out       [total, mean]                   0, 0.00
Success         [ratio]                         100.00%
Status Codes    [code:count]                    200:1000
Error Set:

秒間1250リクエストを1秒間

$ echo "GET http://cf-dora.ng.bluemix.net/" | ./vegeta attack -rate=1250 -duration=1s | ./vegeta report
2014/03/01 17:35:26 Vegeta is attacking 1 targets in random order for 1s...
2014/03/01 17:35:43 Done!
2014/03/01 17:35:43 Writing results to 'stdout'...
Requests        [total]                         1250
Duration        [total]                         1.243986787s
Latencies       [mean, 50, 95, 99, max]         7.664525424s, 6.135629385s, 14.681166477s, 14.772027172s, 15.35050538s
Bytes In        [total, mean]                   13260, 10.61
Bytes Out       [total, mean]                   0, 0.00
Success         [ratio]                         81.60%
Status Codes    [code:count]                    200:1020  0:230
Error Set:
Get http://cf-dora.ng.bluemix.net/: dial tcp 75.126.70.44:80: too many open files

再度秒間1250リクエストを1秒間

$ echo "GET http://cf-dora.ng.bluemix.net/" | ./vegeta attack -rate=1250 -duration=1s | ./vegeta report
2014/03/01 17:41:29 Vegeta is attacking 1 targets in random order for 1s...
2014/03/01 17:41:40 Done!
2014/03/01 17:41:40 Writing results to 'stdout'...
Requests        [total]                         1250
Duration        [total]                         1.195024125s
Latencies       [mean, 50, 95, 99, max]         2.980611716s, 1.86887065s, 9.705554255s, 10.104980107s, 10.104980107s
Bytes In        [total, mean]                   16250, 13.00
Bytes Out       [total, mean]                   0, 0.00
Success         [ratio]                         100.00%
Status Codes    [code:count]                    200:1250
Error Set:

今度は通りました

まとめ

  • 1インスタンスから2インスタンスにしても変わらず
  • 5秒間で1250リクエストでも、1秒間に1250リクエストでも概ね変わらず

この辺りの原因は以下が考えられると思います。

  • vegetaを使う側のマシンが原因 or Vegetaの限界?
  • あるいはdoraのフロント側にいる『ロードバランサ』 or 『Gorouter』と呼ばれるアプリのルーティングを司る部分
  • doraに起因

1000リクエストを超えると揺らぐ部分について、細かい所の原因は深く追えていませんが
とはいえgo getコマンドでサクッとこのようなツールが入って簡単に試せるので
vegetaは便利なツールだと思います

vegetaその他の細かい使い方等の説明はREADME.mdを参照してください

42
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
morikat
普段はCloud Foundryの業務を担当 GitHubで公開されている便利そうなアプリを見つけるとCloud Foundryで載せられないかな?と普段よく思っていながら過ごしています

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
42
Help us understand the problem. What is going on with this article?