JMeterによるMoodleの負荷試験(テストプランの作り方)

# Moodleサーバの負荷試験

JMeterを使用すると、サーバに対して負荷試験が出来る。Moodleにはテストプランを作る機能があるのでこれを使ってテストを行う。

# 注意

本番稼働中のMoodleサーバや、他人のMoodleサーバには__絶対に実行しないでください__。

# ダウンロードと起動
http://jmeter.apache.org/download_jmeter.cgi

zipファイルを解凍後、中に入っている`bin/jmeter.bat` をダブルクリックで実行する。

<img width="1260" alt="2018-02-13_1110.png (64.7 kB)" src="https://img.esa.io/uploads/production/attachments/8158/2018/02/13/4181/492cdcaf-32e2-4a6a-ad34-e43f6e385740.png">

# Moodle上での準備
Moodle上で、JMeterのテストプランを作成出来るが、前提条件がいくつかあり、全てクリアしないといけない。

## テスト用コースとモジュールの作成
テスト用のコースを作成し、次のモジュールをコース上に追加する。

* ページ
* フォーラム(返信がついたディスカッションが存在する状態であること)

### !!ハマりポイント!!
フォーラムを作成する際、コースに既に「アナウンスメント」フォーラムモジュールがある場合は、__これを削除するか、これをそのまま使うこと__。テストプランを作る際、コース上の「最初のフォーラム」しか見てくれないため。(__追加でフォーラムを作っても無視される__)

```php:\moodle\admin\tool\generator\classes\testplan_backend.php
        // Getting the first forum module instance and it's first discussion and reply as well.
        if (!$forums = $courseinfo->get_instances_of('forum')) {
            print_error('error_noforuminstances', 'tool_generator');
        }
        // ここがダメ！！
        $forum = reset($forums);

        // Getting the first discussion (and reply).
        if (!$discussions = forum_get_discussions($forum, 'd.timemodified ASC', false, -1, 1)) {
            print_error('error_noforumdiscussions', 'tool_generator');
        }
```

## テスト用ユーザー作成

パスワードを`moodle`にリセットした十分な数の登録済みユーザ (ユーザー数は、テストプランで要求される数だけ作成する)

登録件数が非常に多いため、CSVの`course1`カラムで負荷試験用のコース(shortname)を指定することでCSV登録時に一緒にコース登録も行う。

## config.phpへの追記

`config.php`に次を追記する。ここで設定するパスワードは、事前にCSVでアップロードするテスト用アカウントのパスワードを指定する。

```php:config.php
$CFG->tool_generator_users_password = "moodle";
```

諸々用意をすると、テストプランをダウンロードすることが出来る。

<img width="1221.75" alt="2018-02-13_1554.png (127.3 kB)" src="https://img.esa.io/uploads/production/attachments/8158/2018/02/13/4181/cbecde7d-e66c-4b65-b9fc-11e5908b1c5c.png">

ここで、`テストプラン`と`ユーザーファイル`をダウンロードする。

|ファイル|意味|
| --- | --- |
| テストプラン | JMeterに読み込ませるプランファイル。どのように画面遷移を繰り返していくか等が定義されている。 |
| ユーザーファイル | JMeterに読み込ませるユーザー一覧のファイル。テストで使用するユーザー名とパスワードが保存されている。 |

# JMeterのセットアップ

JMeterを起動し、`File` -> `Open` でテストプランをロードする。
次に、以下の設定を変更する。

## Test Plan

左ペインの `Test Plan`  の設定を次の通りにする。既に設定済みになっているが、__forumまわりの値は怪しいというか間違っているので自分で修正する。__

|設定項目|設定値|IDの見分け方|
| --- | --- | --- |
| courseid | 負荷試験用コースID(テストプラン作成時に指定したコース) |https://example.com/course/view.php?id=2|
| pageactivityid | 負荷試験用コースに作成した「ページ」のID |https://example.com/mod/page/view.php?id=3|
| forumactivityid | 負荷試験用コースに作成した「フォーラム」のID |https://example.com/mod/forum/view.php?id=2|
| forumdiscussionid | 「フォーラム」内のディスカッションID |https://example.com/mod/forum/discuss.php?d=2|
| forumreplyid | 「フォーラム」内のディスカッションに紐付く返信のID|https://example.com/mod/forum/post.php?reply=5#mformforum|

※IDはURLから判定する。

<img width="997.5" alt="2018-02-14_1056.png (101.2 kB)" src="https://img.esa.io/uploads/production/attachments/8158/2018/02/14/4181/efb23a20-e6c1-49d6-9193-107e1d923e47.png">

## Warm-up site・Moodle Test

### Default site request

左ペインの `Test Plan` -> `Warm-up site`  および `Moodle Test` -> `Default site request` の `Basic`タブにある `Web Server` の設定を次の通りにする。

|設定項目|設定値|
| --- | --- |
| Protocol | https |
| Port Number | 443 |

### CSV users data

左ペインの `Test Plan` -> `Warm-up site` および `Moodle Test` -> `CSV user data`の設定を次の通りにする。

|設定項目|設定値|
| --- | --- |
| Filename | ユーザーファイル(CSV)を指定する |

### Create php array results(無効)

左ペインの `Test Plan` -> `Moodle Test` -> `Create php array results`を__無効__にする。
`Create php array results`を右クリックし、`Disable`をクリックする。

<img width="263.25" alt="2018-02-14_1059.png (26.3 kB)" src="https://img.esa.io/uploads/production/attachments/8158/2018/02/14/4181/459e8bc5-0e94-4bda-b046-c5415bfa10d2.png">

## Listnerの追加

Listnerを追加することで、結果を表・グラフ表示出来るようにする。

左ペインの`Test Plan`を右クリックし、`Add` -> `Listener` から、次のリスナーを追加する。

|追加するリスナー|
| --- |
| Graph Results |
| View Results in Table |
| Response Time Graph |

<img width="490.5" alt="2018-02-14_1242.png (69.2 kB)" src="https://img.esa.io/uploads/production/attachments/8158/2018/02/14/4181/9f359be5-be27-4b24-9fd6-f6e60a2436fe.png">


# JMeterの実行
Moodleにユーザーを追加し、コースの準備が整ったらテストを実行する。
テスト実行時には、htopなどでサーバの状態を確認出来るようにしておく。

上部メニューの実行ボタンをクリックして実行する。

<img width="992.25" alt="2018-02-14_1105.png (24.6 kB)" src="https://img.esa.io/uploads/production/attachments/8158/2018/02/14/4181/bc509690-cecc-4726-9271-f8362d8417a0.png">

# 実行結果

追加したListnerに結果が表示される。また、実行中に`htop`で常に負荷状況をモニタリングすると状況を把握できる。