SRE兼スクラムマスターのブログ

チーム開発が好きなエンジニアブログです。検証した技術やチームの取り組みを書いていきます。

初心者の 負荷試験入門 2

はじめに

本記事は初心者の負荷試験入門シリーズの第2弾です!

前回の 初心者の負荷試験入門 その1 では、負荷試験のざっくりとした目的や指標、性能改善をまとめました。負荷試験を実施するにあたってどのような指標が必要なのかは何となくわかりましたが、実際にどのようなToolを利用してシステムに負荷をかけていくのかはまだ見ていないので今回はそれをまとめてみようと思います。

負荷試験ツール

ひとえにツールといっても負荷試験のツールにはいくつか種類があるようで、主に「攻撃ツール」、「モニタリングツール」、「プロファイリングツール」の3種類のツールを利用する。 ツールの役割はこんな感じ 攻撃ツール:システムに負荷を与えるツール(大量リクエストの送信など) モニタリングツール:システムのリソース状況を観測して可視化するツール プロファイリングツール:ミドルやアプリケーション内部を解析して可視化するツール

攻撃ツールの選択

攻撃ツールとは

システムを利用する側の動きをシミュレーションすることにより、対象のシステムを高負荷状態にできるツールのことを指します。 攻撃ツールを利用することでシステムに大量のリクエストが発生し、Dos攻撃を受けたかのような状態となります。

攻撃ツールに求められる要件

負荷試験を行うために攻撃ツールに必要とされる主な要件は下記の4つになります。 1.リクエストを正しくシミュレーションできること 2.攻撃の強さを制御できること 3.対象のシステムに対して十分な負荷を発生させられること 4.攻撃ツールの設置場所、起動場所を選択できること

1.リクエストを正しくシミュレーションできること 攻撃ツールによってはシナリオを組んだ攻撃が出来ないツールも存在するため、負荷試験の要件にそぐわない場合はこれらのツールを選定から外した方がよさそうです。

2.攻撃の強さを制御できること クライアントの同時起動数、リクエスト間隔、最大スループット数を調整することで攻撃の強さを設定できます。

3.対象のシステムに対して十分な負荷を発生させられること 攻撃ツールにより、どこまでの高負荷状態を効率よく発生させられるかが異なる為、自分たちのシステムの特性に合ったツールを選択する必要があります。

4.攻撃ツールの設置場所、起動場所を選択できること 攻撃ツールによって起動できる攻撃サーバに制約がある為、攻撃サーバを設置する場所が制限されるものがあります。

攻撃ツール用語

ツールによって多少用語が異なることがありますが、たいていの攻撃ツールは下記表のような概念が存在しています。用語を理解していればツールが変更になったとしても同じように負荷試験が行えるようです。

用語 説明
クライアント HTTPリクエストを同時に1つだけ発行できるリクエスト生成機
クライアントの同時起動数 攻撃ツール上で利用される攻撃用クライアントの数
Ramp-Up 期間 攻撃開始後にすべてのクライアントが起動するまでのウォームアップ期間
シナリオ クライアント毎に設定されたHTTPリクエストの発生パターン
シナリオ実行回数 クライアントがシナリオに沿ったリクエストを実施する回数
スループット システムが単位時間あたりに処理できるリクエストの数
レイテンシ 攻撃ツールがリクエストを出してからレスポンスを受け取るまでの期間

攻撃ツールの例

具体的な攻撃ツールを一部紹介しています。(各ツールの詳細については割愛します…調べたら記述予定)

  • Apache JMeter 特徴
    • リクエスト毎に動的にパラメータを変更可能
    • 複数のURLを組み合わせたシナリオを実施できる
    • GET,POST,PUT,DELETEメソッドの試験が可能 etc
  • Locust 特徴
    • シナリオをPythonスクリプトで記述できるため、柔軟なシナリオが作成できる
    • 結果表示がシンプル
    • 必要なサーバリソースが少ないた為、攻撃サーバで負荷をかけやすい etc
  • Gatling 特徴
    • developerフレンドリーなシナリオファイル
    • 見やすいレポートHTML etc

攻撃ツールにはそれぞれ特徴があり、負荷試験の対象となるシステムによって使い分けることが必要です。 とくに同じシステムに対する負荷試験でも利用するツールによって大きく結果がことなることがあるため、場合によっては複数のツールで攻撃を行い結果を比較してみることも必要かもしれません。

モニタリングツール/プロファイリングツール

攻撃ツールの中にはスループットの監視ツールや可視化ツールが含まれているものも多いですが、攻撃ツールから観測できるレイテンシはシステム全体のレイテンシのみであり、個別のサブシステム等のレイテンシは観測できません。

サブシステムにおける詳細なモニタリングやプロファイリングを補助するためのツールとして以下があります。 - topコマンドとnetstatコマンド - AWS管理コンソール(AWSを利用している場合) etc

そしてこれらのツールを利用してモニタリングしておきたい項目が以下の表になります。

サブシステム 監視すべきもの
ネットワーク 転送量
ハードウェアやOS CPU,メモリ,プロセス数,SWAP
TCP 外部へのコネクション状況
ディスク R/W 転送データ量
サーバミドルウェア コネクション数
アプリケーション プロファイラーにて監視

今後について

負荷試験に利用するツールについて調べたが主に攻撃ツールの特性による試験の向き不向き等が見えてきました。モニタリングについては文章ベースなので今後、実際にサンプルアプリケーションを作成して負荷試験を試してみる中でモニタリングのやり方を学習していこうと思います。

そのほか、こんなツールがあるよなど情報があればぜひご連絡頂ければと思います。