Skip to content

Instantly share code, notes, and snippets.

@hakobera
Last active August 29, 2015 14:17
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hakobera/e47dd940b92f56d8bf1a to your computer and use it in GitHub Desktop.
Save hakobera/e47dd940b92f56d8bf1a to your computer and use it in GitHub Desktop.
Quipper を支えるテスト技術@時雨祭 2015/03/21

Quipper を支える負荷テスト技術

前提

今日はWebアプリケーションの負荷テストに絞って話をします。 今日はデモが中心です。この資料だけ読んでも、よくわからないと思いますので注意。 詳細は大体以下の記事に書いてあります。

Docker + Google Container Engine でドカドカ負荷テスト

負荷テストについて

全般

以下の資料がよくまとまっているので、読んでみてください。

Webアプリケーション負荷試験実践入門

なぜ負荷テストをしないのか?

準備が面倒くさい。 特にシナリオ作成と(負荷をかける側の)インフラ構築。 これを解消したい。

解決策

  • シナリオ作成が面倒くさい

    • ある程度は仕方がない
    • ただし、XMLと格闘するのは本質ではない
    • 何らかのプログラミング言語で書けると便利
    • Python で書ける Locust を使えば良い
  • インフラ構築が面倒くさい

    • Docker で解決

Locust について

概要

Qiita の以下の記事が参考になります。 Python 製負荷テストツール Locust を Docker コンテナで試す

Google Container Registry について

Google が提供してくれる Docker Private Registry サービス。 Google Container Engine 使うなら、とりあえず何も考えずに使うべき。

https://cloud.google.com/tools/container-registry/

Google Container Engine

Google が提供してくれる Docker クラスタのマネジメントサービス。

https://cloud.google.com/container-engine/

中身は Kubernetes (ただし、最新バージョンが入っているとは限らない)

先に答えておく FAQ

  • インターネット越しの負荷試験に意味はあるのか?

  • これだと性能限界を探れないのでは?

    • それはそう。でも、やらないよりは何倍もマシ

デモ

デモをします。

Tips

アカウント一覧ファイルからユーザを選んでログイン

例えばこんな感じ

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:
  # レスポンスエラー時に別の処理をするなど

kubectl のヘルプ

ここ見てください。動かないコマンドもあります。

https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment