Erlang/OTP と Lua で負荷試験ツール (2)

V
shiguredo
Published in
4 min readFeb 11, 2018

負荷試験製品の骨組みができてきた。今回はアーリーアダプターとしての顧客が数社いるため、まずは動くものを優先に作っていってる。

負荷試験ツール

この製品は使うときだけ起動するというよりは、常時起動しておき、HTTP API 経由で好きなタイミングで使える負荷試験ツールとして開発している。

負荷試験は準備が面倒だったりするため、しっかり計画を建てて行うというのがよくあるが、これはできるだけ気軽に負荷試験を行えるのを目的としている。

全体構成

今回の全体構成図を起こしてみた。

Web API での負荷試験の世界では仮想ユーザ (VU) というのが標準らしいので真似をすることにした。

登場人物は master と worker と vu の 3 種類。

  • master は worker の管理
  • worker は VU の管理
  • VU は Lua を実行する 1 仮想ユーザ

master は常時起動しており、worker は必要なときだけ起こして使う。worker の起こし方などはクラウド毎に仕組みがことなるため、この製品では取り扱わないことにする。

とりあえず 1 worker で 5 万 VU を目標にしている。worker は最大 100 台を想定。そのため今回この負荷試験サーバは最大 500 万 VU を実現できる仕組みにしたい。

構築を簡単に

AWS だとスポットインスタンスを使うことを想定している。必要なときだけ建てて、あとは実行したら終了していくという仕組みを想定している。

とにかく構築を簡単にしたいという思いがある。負荷試験は準備が大変というイメージが強い。これを払拭したい。

負荷試験のフロー

  1. 負荷をかける URL やシナリオ、終了時間または終了回数、そして仮想ユーザ数を指定してセットアップ用の HTTP API を叩く。
  2. master は用意されているサーバに worker をセットアップしていく
  3. worker は VU をセットアップしていく
  4. 開始用 HTTP API を叩く事で全ての VU が指定された URL に負荷をかけ始める
  5. 指定した終了時間、または終了回数がきたら VU は負荷をかけるのを終了する
  6. 全ての VU が終了したら、worker は自分を終了させ master に通知する

worker は VU が負荷をかけている間も定期的に master に統計情報などを通知する。

シナリオの繰り返し

シナリオは繰り返し実行される。状態を持ち回したり、持ち回さなかったりできる。

繰り返し実行する際のインターバルの時間も指定できる。

local http = require "shiguredo.http"
local json = require "shiguredo.json"
local client = require "shiguredo.client"
-- VU に渡されるユニークな VU の ID を取得する
local id = client.get_id()
local json = json.encode({id = id})
local res = http.post("http://192.0.2.1/bacon", {}, json)
local res_json = json.decode(res)
-- 3000 ミリ秒待つ
client.sleep(3000)
local beacon = res_json.beacon
local json = json.encode({bacon = bacon})
local res = http.post("http://192.0.2.1/spam", {}, json)

例えばこのシナリオの実行が終わったら、10 秒待つそれを繰り返すという動作を実行できる。

また待つ時間にはランダムな数値を指定でき、10秒プラスマイナス 5 秒なんて仕組みもできる。

--

--