k6を使って負荷試験を行いました!


こんにちは。クラウドソリューション開発部の中野です。
 
今年の4月に新卒として入社しました。
開発チームでのOJT初業務として、開発中のWebサービスの負荷試験を経験しました。
そこで学んだ k6 を用いた負荷試験に関して、自分の備忘録兼解説として記事にさせていただきます。

なお、動作検証は  Windows 10 の WSL2 Ubuntu 22.04 で行いました。
環境構築から始める場合は、以下の記事などを参考に事前準備をお願いします。
https://news.mynavi.jp/techplus/article/20220430-2330411/

負荷試験とは?

負荷試験は、その名の通りシステムに負荷を与え、様々な条件下でも安定して動作しているかを確認するテストのことです。
一般的には結合試験等の不具合修正が収束した辺りで行うもので、
アプリケーションプログラム自体のバグ・不具合を洗い出す目的ではなく、
包括的にシステムのスペックを担保したり、負荷的に弱い部分を把握したり、限界性能を確認したりするために行われます。
 
k6 のマニュアルによると、負荷試験は大きく5つの種類に分けられます。

  1. ロードテスト
    →想定されている負荷(同時ユーザー数や1秒あたりのリクエスト数)を与え、システムのパフォーマンスを評価する
  2. スモークテスト
    →最小限の負荷を与え、エラーなく動くことを確認する
  3. ストレステスト
    →通常時の想定以上の負荷を与え、高負荷状態での安定性と信頼性、システムの限界点を判断する
  4. スパイクテスト
    →一気に大量の負荷を与え、突然の負荷増加によってシステムがどのように機能するかを確認する
  5. ソークテスト
    →長期的に負荷を与え続け、信頼性やパフォーマンスを確認する

今回は簡単なロードテストを実施します。

k6 について

今回使う k6 は、比較的新しいオープンソースの負荷試験ツールで、下記の特徴があります。

  • ログイン・認証などを伴わないシンプルなシナリオであれば、数分で実行できる
  • シナリオを JavaScript で記述することができる
  • 並列数、リクエスト数、テスト時間といったステップ設定が可能
  • Grafana 等の外部モニタリングツールとの連携を意識した設計になっている

なんといっても JavaScript で記述できるのがわかりやすくて良いですよね!

実施準備

今回の作業用に、任意の場所に作業用ディレクトリ(フォルダ)を作成しておいてください。
以下ではディレクトリが

であると仮定して進めます。

k6 本体のインストール

この記事執筆時点では、
Ubuntu 22.04 であれば、apt 経由で最新版の v0.41.0 がインストールできます。

その他の環境でのインストール手順については公式サイトをご確認ください。

k6 スクリプトの準備

今回は、エコモットの Tech Blog トップページ ( https://www.ecomottblog.com/?cat=27 ) に対して、HTTP 通信の GET メソッドがエラーにならないかどうかをテストしてみます。
作業用ディレクトリに http_get_ecomottblog.js という名前のファイルを作成し、以下のコードを書いて保存します。

実行①

早速負荷試験を実行してみたいと思います。
作業用ディレクトリで、以下のコマンドを実行してください。

以下のように出力されれば成功です。

標準のメトリクス(指標群)ではそれぞれ、平均値、最小値、中間値、最大値、90%値、95%値が表示されます。
例えば、http_req_duration( http_req_sending + http_req_waiting + http_req_receiving )を見ると、
HTTPリクエストを投げた時、90%が0.58秒程度で応答されているのが判ります。

より詳細な解説は公式ドキュメントをご覧ください。

実行➁

続いて、オプションを指定して実行してみたいと思います。
k6 では標準で以下のオプションを使うことができます。

  • VUS: virtual users (VUs) の略で、試験シナリオの中の試験本体部分を並列実行する無限ループの数のこと
    ※試験シナリオには、試験中1回しか実行されない準備部分や後処理部分もあります。
  • iteration:試験シナリオの中の試験本体部分の繰り返し回数のこと
  • duration:試験シナリオの継続時間のこと

実行①で行った試験の実行結果に以下の記載がある通り、

VUS:1 で1回だけ実行されていました。
 
 
これを VUS:3 、シナリオ継続時間を5秒間に変更してみましょう。
以下のコマンドを実行してください。

31回実行されたのが判ります。

次は継続時間ではなく、繰り返し回数を指定してみます。

5.6秒で実行できたのが判りますね!

まとめ

k6 を使うと、JavaScriptを数行記述するだけで簡単な負荷試験が行えます。

負荷試験というと難しいイメージがありましたが、拍子抜けするくらい簡単で、初めて実行したときは驚きました。
今後も新しいことをどんどん覚えていきたいです!