サーバーレスで負荷テストが実施できるserverless-artilleryを試してみた
こんにちは、スペースマーケット エンジニアの西尾です。
今日は負荷テストツールserverless-artilleryについて簡単に試してみたので、そのことについて書こうと思います。
負荷テストを行う上で感じていた課題
負荷テストについては機能面に目が行きがちで後回しになりがちなものですが、実はとても重要な項目だと思っています。
表示が遅いページだとみたくなくなっちゃいますよね。
負荷テストを行うことで
・どれくらい捌けるか知ることで適切なサーバーリソース配分を知ることができる
・システムのボトルネックを知ることができ、改善につなげることができる
スペースマーケットの中でも速度は重要な項目でよく改善施策を行っていますが、「推測するな計測せよ」という格言があるように改善を行うためにも簡単に計測できる仕組みが重要になってくるかと思います。
過去に私も何度も性能測定を行ってきました。
最初に使ったのがよく負荷テストツールとしてあげられるJmeter。
まだ、GraphQLを本格的に使う前に検索画面の速度改善を行ったのですが、そこでも大活躍してくれたツールでした。
そこから時を経てGraphQLを本格的に使うようになり、どのクエリ叩くかシナリオや配分を作るのが面倒とかもあり、独自でツールを作って性能試験を行うということもやってきました。
ただどちらも実際に試験をするときは手元の環境から負荷をかけていました。
その理由が単純にサーバー構築が面倒であったことですが、実際やっている最中は手元のPCの負荷が高すぎて他の作業ができなかったり、手元のPCの性能以上の負荷をかけられなかったり、オフィスのネットワークが全体に重くなったりと簡単だけどデメリットの面も大きかったです。
Jmeterとかのツールではもちろん手元じゃなくてもサーバー上で複数台で負荷テストを行うことが可能ですが、サクッとはできないので結局ローカルでいいやという感じにしてました。
serverless-artilleryについて
serverless-artilleryはArtilleryという負荷テストツールをサーバーレス環境で実行できるツールです。
わざわざ自前でEC2インスタンスを立ててインストールしなくとも簡単に負荷テスト環境が作れちゃいます。
内部ではServeless FrameworkというServerless Applicationを構成管理、デプロイするためのツールを使っているようです。
これを使えば環境作るの面倒なので、、、という課題を解決してくれそうな雰囲気がします。
どれくらいサクッと環境を作れ、実行できるか試してみます。
serverless-artillery セットアップ
適当なローカルフォルダでnpmコマンドでインストールします。
npm init
<package.jsonから不要な部分を削除>
npm install artillery
npm install serverless
npm install serverless-artillery
ここまでで次のコマンドが使えればインストールできています。
AWS account credentialsの設定をします。(キーを取得して設定)
[chato@chato] $ aws configure
AWS Access Key ID [****************Z64A]: <取得したキーを>
AWS Secret Access Key [****************RtsY]: <取得したアクセスキーを>
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [json]: json
serverless-artillery 実行
実際に実行してみます。
まずはscript.ymlを作成し、その中にどこに対してリクエストをどのくらいの間隔で投げるか記載します。
例ではダミーサーバーの/users配下に50秒間、1秒で1リクエストを投げる設定をしています。
config:
target: "http://54.238.157.138"
phases:
-
duration: 50
arrivalRate: 1
scenarios:
-
flow:
-
get:
url: "/users"
リクエストの設定が終わったら配置していきます。
slsart deploy --stage test --region=ap-northeast-1
少し経つとdeployが完了します。
deployが完了したら次のコマンドで呼び出してみます。
slsart invoke --stage test --region=ap-northeast-1
呼び出し後にダミーサーバー側のログを見ると/usersにリクエストが1秒間に1回きていることがわかります。
CSVからデータを読み込んで実行
先は単純に1エンドポイントで特に変数もなく実行しましたが、実際に負荷テストで使おうとしたら/rooms/<room_id> といったように可変のURLにリクエストを投げることになると思います。
artilleryではCSVを読み込んで実行することもできるため、次のようにscript.ymlを書き換えて可変のURLに対してリクエストを投げてみます。
config:
target: "http://54.238.157.138"
phases:
-
duration: 10
arrivalRate: 2
payload:
path: "rooms.csv"
fields:
- 'room_id'
scenarios:
-
flow:
-
get:
url: "/rooms/{{room_id}}"
rooms.csvには単純にroom_id, user_idを羅列します。今回は羅列した中で先頭のroom_id(1,2,3)の部分だけ使うのでそのようにscript.ymlでは設定しています。
1,100
2,101
3,102
まずは単純にserverless環境ではなくローカルから実行してみると、/rooms/1 -> /rooms/2 -> /rooms/3 -> /rooms/1 ... とその通り順番どおりにはならないですが可変のURLに対してリクエストを実行することができました。
次にserverless環境で実行させるためにdeployしてみるとエラーが発生してしまいました。どうやらrooms.csvファイルがないよというエラーのようです。
これについてはどうやらそのままではダメで、custom deployment assetsを使う必要があるとのことです。
使うためには次のコマンドで各種serverless環境の設定ファイルをいじることができるファイルを生成します。
slsart configure
色々なファイルが生成されますが、その後再度deploy、invokeすると無事サーバーレス環境でもcsvファイルを元にしたリクエストを発行してくれました。
ただ、ファイル容量が大きくなり、アップロードに少し時間がかかるようにはなりました。
大量のリクエストを実験
最後に秒間2000リクエストを60秒間、合計120000リクエストを試してみます。
さすがに何も処理しないダミーサーバーであっても結構な負荷がかかっていましたが、無事120000リクエストが投げられていました。
最後に
今回はサーバーレス環境で実行できる負荷テストツールserverless-artilleryを簡単ではありますが試してみました。
今まではサーバー構築するのめんどくさいという思いからローカルで負荷試験を自分はやっていましたが、今回serverless-artilleryを使ってみて思った以上に簡単セットアップができ、かつ大量のリクエスト生成もできることを体感しました。
サーバーレス、、、バズワードだと思っていましたがインフラ考えなくて良いは非常に楽ですね。今回はダミーサーバーのためにEC2にnginx, railsセットアップの方が手間取ったくらいでした。
この記事が気に入ったらサポートをしてみませんか?