LocustでWebサイトの性能測定をする(とりあえずDockerで動かしてみた編)


はじめに

Webサイトの性能測定といえばJMeterが定番な感じだが、そもそもなかなか起動させるまでの道のりが長くて学習コスト的にアレだったので、シナリオがPythonでお手軽に書けるという噂のLocustを使ってみた。

今回は、EC2でDockerでインストールしてとりあえず動かすところまで。
ちなみに、t2.microでは動作が不安定なので、t3.mediumくらいで起動すると良い感じであった。

Dockerのインストール

これはもう定番の手順だけど一応書いておく。

yumの最新化
$ sudo yum update -y
Dockerのインストール
$ sudo yum install -y docker
Dockerの開始
$ sudo service docker start
ec2-userをdockerグループに追加
$ sudo usermod -a -G docker ec2-user

ここで1回ログアウトして再ログイン(セッションを作り直さないと設定が反映されない)。

Dockerの起動確認
$ docker info

↓こんな感じで標準出力されればOK。ダメならDockerが起動してないとかなんとかといったメッセージが出る。

Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
(以下略)
docker-composeインストールのためにユーザ変更
$ sudo -i
docker-composeを拾ってきてインストール(バージョンは適宜変更する)
# curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
パーミッション変更
# chmod +x /usr/local/bin/docker-compose
戻る
# exit

これでDockerの仕様準備完了!簡単!

Locustの動くコンテナを作る

以下のようにDockerfileを書こう。
Pythonを動く環境を作って、locustをインストールして、ローカルのlocustfile.pyをコピーして起動!
ファイルはlocustfile.py固定になってしまうので、適宜変更したらリロードして起動する。

Dockerfile
FROM python

RUN pip install locust

WORKDIR /locust
COPY ./locustfile.py .

CMD ["locust"]

これを、docker-compose.yml で設定してdocker-compose upする。

docker-compose.yml
version: '3'
services:
  locust:
    build: .
    ports:
      - "8089:8089"

だがちょっと待て。肝心のlocustfile.pyが無いと起動しない。
以下が起動のための最低セットだ。

locustfile.py
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 1)

    @task
    def get_contents(self):
        self.client.get("/test-contents.html")

ちなみに、wait_time の属性には以下の3種類が設定可能だ。詳細は(公式のドキュメント)[https://docs.locust.io/en/stable/api.html#module-locust.wait_time]を参照。
小数点以下の値も設定可能。

  • between(min_wait, max_wait): トラフィック投入後にmin_wait~max_waitの範囲でwaitを入れる
  • constant(wait_time): トラフィック投入後に固定の秒数でwaitを入れる
  • constant_pacing(wait_time): トラフィック投入後、wait_time に合う時間分 wait を入れる。安定して負荷をかけたい場合はこの設定

試験対象のホストにはtest-contents.htmlを置いておこう。

さて、これでdocker-compose upしたら、EC2に8089でHTTP接続する。

いざ、動かす!

HTTP接続すると、以下のように設定画面が出る。

接続ユーザ数と、ユーザ生成/秒と、ホスト名だ。
ホスト名の後ろに、locustfile.pyを付けてアクセスするイメージだ。

適当に値を入れて起動すると、

といった感じで負荷状況が表示される。

さらに、Chartsを選択すると、

グラフも見られるぞ!

「Download Data」からこのグラフのネタが取れるかと思いきや、取れたcsvにはこの情報は含まれていなかった。なぜ……。

ということで、まずは性能測定の足掛かりができた!

追記

グラフの元ネタの数値はダウンロードできなかったが、グラフ右上の

このボタンから、グラフのPNG画像はダウンロードできることが分かった。便利!