Web開発にとっては、負荷テストは大事なことですね。
負荷テストとはアクセス数が多い時、サーバエラーが発生するか、データ返却の速度が遅くなるか、ロードバランサーとオートスケーリングが正常に動くかという検証することです。
今回のテックブログの主人公は artillery.io です。
artillery.io は有料プランがありますが、無料でも使えます。
① artillery.ioをインストールする
artillery.ioのホームページはここです: https://www.artillery.io/
artillery.ioをインストールするため、nodejsをインストールする必要があります。
npm を使って、artillery.ioをグローバルのパッケージとしてインストールします。
npm install -g artillery@latest
artillery.ioが正常にインストールされたか、下記のコマンドで確認できます。
artillery dino
恐竜のようなASCII画像が返却されたらartillery.ioが正常にインストールできたということです。
② デモのため、負荷テスト対象の環境を構築
これから簡単なAPIサーバを作成します。検証の時、DBの様子も観察しましょう!
利用するAWSサービスは Elastic Beanstalk と RDSです。
Elastic Beanstalkの設定:
RDSの設定:
APIは処理が軽いapiと処理が重いapiの2つを用意します。処理が重いapiは約4秒でデータ返却します。
③ テストのconfigファイルを作成
config.yml
# デプロイしたEB環境のURL target: "https://testartillery.com/v1" http: # デフォルトのタイムアウトを延長する timeout: 60 phases: # テストの期間、 300秒 = 5分 - duration: 300 # 1秒間で2回api叩く arrivalRate: 2 name: stress test scenarios: - name: "fast query" flow: - get: url: "/fast" - name: "slow query" flow: - get: url: "/slow"
④ テスト実行
artillery run config.yml -o report.json
のコマンドでテスト実行します。
結果はこんな感じです。
大部分はタイムアウトされました。処理が重いapiは約4秒でデータ返却する想定でしたが、アクセスが多い時、ほぼタイムアウトされたように見えます。そして、スケールアップイベントも起きません。モニタリングをみてみたら、CPUの利用率は低かったです。 DBのCPUの利用率も見てみます。
DBのCPU利用率は高かったです!
この利用率が高い問題はDBのインスタンスタイプを変更するか、リードレプリカを追加するかのどちらかで解決できますね。
上記のテストは簡単ですが、artillery.ioはもっと難しいテストにも対応できそうです。色々試して、こちらのコメント欄でアドバイスや経験を共有していただけると幸いです。
では、今日の記事はここまでです。それではまた次の機会に。。