今日はWebアプリケーションの負荷テストに絞って話をします。 今日はデモが中心です。この資料だけ読んでも、よくわからないと思いますので注意。 詳細は大体以下の記事に書いてあります。
Docker + Google Container Engine でドカドカ負荷テスト
以下の資料がよくまとまっているので、読んでみてください。
準備が面倒くさい。 特にシナリオ作成と(負荷をかける側の)インフラ構築。 これを解消したい。
-
シナリオ作成が面倒くさい
- ある程度は仕方がない
- ただし、XMLと格闘するのは本質ではない
- 何らかのプログラミング言語で書けると便利
- Python で書ける Locust を使えば良い
-
インフラ構築が面倒くさい
- Docker で解決
- Docker イメージの管理が面倒くさい
- Docker クラスタの構築が面倒くさい
- Google Container Engine で解決
- Docker で解決
- Python で書かれた負荷テストツール
- インストールが簡単 (pip でインストールできる)
- 分散環境が簡単に構築できる
- シナリオが Python スクリプトで書ける!
Qiita の以下の記事が参考になります。 Python 製負荷テストツール Locust を Docker コンテナで試す
Google が提供してくれる Docker Private Registry サービス。 Google Container Engine 使うなら、とりあえず何も考えずに使うべき。
https://cloud.google.com/tools/container-registry/
Google が提供してくれる Docker クラスタのマネジメントサービス。
https://cloud.google.com/container-engine/
中身は Kubernetes (ただし、最新バージョンが入っているとは限らない)
-
インターネット越しの負荷試験に意味はあるのか?
- Webアプリケーション負荷試験実践入門 の99ページに間違った方法として記載されている
- Heroku を使ってる時点でインターネット越し以外の負荷書ける方法がないので仕方ない
-
これだと性能限界を探れないのでは?
- それはそう。でも、やらないよりは何倍もマシ
デモをします。
例えばこんな感じ
id1,password1
id2,password2
...
import csv, itertools
...
account_csv_reader = itertools.cycle(csv.reader(open("%s/accounts.csv" % work_path, "r")))
def on_start(self):
user_id, password = account_csv_reader.next()
user = self.login(user_id, password)
....
from locust import HttpLocust, TaskSet, task, runners, events
...
def output_success_log(request_type, name, response_time, response_length, **kw):
timestamp = int(time.time() * 1000)
# Fluentd に送信したり etc...
def output_failure_log(request_type, name, response_time, exception, **kw):
timestamp = int(time.time() * 1000)
# Fluentd に送信したり etc...
events.request_success += output_success_log
events.request_failure += output_failure_log
res = self.post("/users", {...})
if res.status_code == 200 or res.status_code == 201:
self.token = res.json()['token']
# トークンを使って次のリクエスト作成....
next_res = self.post("/some_api", { token: self.token })
...
else:
# レスポンスエラー時に別の処理をするなど
ここ見てください。動かないコマンドもあります。
https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md