多重度は試験の道具に過ぎない
ここまで説明してきたように、スループットと多重度は、関係はしているものの別の概念です。しかし、両者が混同されている例もしばしば見受けられます。例えば、性能要件として「100ユーザ」とか「クライアント端末5000台」と書いてある仕様書やRFPを見かけます。しかし、このような数字は、性能試験をする上では役に立ちませんし、システムの性能を担保するものでもありません。必ずスループットを算出する必要があります[8]。
前節①の公式からも明らかなように、レスポンスタイム+シンクタイム、スループット、多重度のうち、2つが決まれば残りの1つは決まります。つまり、性能要件でレスポンスタイムとスループットがきちんと決まっていれば、試験に必要な多重度は見積もれます。先ほどのモデルで考えてみましょう。
ロードミックスなしで、単性能(無風状態で多重度1で処理を実行したときの性能)のレスポンスタイムが3秒、シンクタイムが10秒だとします。目標のスループットが100TPSだとすると、このスループットを出すために必要な多重度は、公式①より、
p / (3+10) = 100
したがって、
p = 100 * (3+10) = 1300
つまり、最低1300多重は必要ということです。かなり多いと感じたかもしれませんね。実際、スループットは多重度を正の整数で割った値なので、多重度はスループットの数倍の値になるのが普通です(何を1つのトランザクションとみなすかによっても変わってきますが)。
ここでの注意点は、負荷による処理遅延を計算していないことです。実際は、1300多重で処理を実行すれば、遅延が起きて1回当たり処理時間が3秒より長くなることもあります。すると、1300多重でも100tpsを達成できなくなります。逆に、思ったよりもレスポンスタイムが速くて3秒より短ければ、1300多重以下で100tpsを達成できます。つまり、負荷試験において多重度とレスポンスタイムは、独立の変数ではなく、後者が前者に依存しているということです。
実際に遅延が出るかどうかは、負荷をかけないと分かりませんが、少なくとも単性能で3秒を満たせていなければ、絶対に負荷試験で目標を達成できません。負荷時のレスポンスタイムが単性能よりよくなるわけがないからです。
逆に考えると、性能目標のスループットを満たせなかった場合、スループットを上げる方法は、公式①より、次の2つになります。
分子(多重度)を大きくする
分子である多重度を上げれば、スループットも上がります。しかし、前述のとおり多重度とレスポンスタイムは独立変数ではありません。単純に多重度を上げても、その分レスポンスタイムが長くなってしまい、結局スループットが上がらないこともよく起きます。
分母(r + th)を小さくする
分母を小さくするには、2つの方向があります。1つは負荷ツールのシンクタイムの設定を短くすること。シンクタイムの長い「間延びした」シナリオにおいては、テンポよくリクエストを投げつけるようにすれば、サーバサイドにボトルネックがない限り、スループットは上がります。シンクタイムは本番想定で設定するのが簡単ですが、これが長いと目標スループットを出すために必要な多重度ばかりが多くなり、負荷端末が無駄に増えるだけなので、適宜短く調整することもあります[9]。もうひとつは、純粋に処理をチューニングをしてレスポンスタイムを短縮するか、キャパシティ限界であればリソースを増強することです。
* * *
以上、本稿ではスループットと多重度の違いに着目しながら、性能要件の持つ意味について説明しました。性能試験を実施する機会のある方々は、適切な要件に基づいて、意味のある試験を実施していただければと思います。くれぐれも、多重度とスループットを取り違えて過大な負荷をかけてしまい、解く必要のない問題に悩むことのないよう気をつけてください。
注
[6]: そうはいっても、ページによっては複雑なビジネスロジックが実行されたり、大量の静的コンテンツを含んでいたりする「重い」ページも存在するので、完全に重さを揃えられるわけではありません。
[7]: アクセスログにはレスポンスタイムも記録することができるので、サーバサイドに限れば、アクセスログだけから両方の性能指標が計算できます。ただし、レスポンスタイムの記録はデフォルトでは有効化されていないこともあります。Apacheではログフォーマットで「%D」を指定することで、マイクロ秒単位のレスポンスタイムが記録されます。IISでは「time-taken」というフィールドを追加することで、ミリ秒単位のレスポンスタイムが記録されます。
参考Apache HTTP サーバ バージョン 2.2 Apache モジュール mod_log_config
参考Microsoft TechNet IIS でのログの構成
[8]: 極端な話、負荷端末のリソースさえボトルネックにならなければ、シンクタイムは0に設定してもかまわないのです。負荷試験の目的は、負荷端末側の多重度ではなく、サーバサイドのスループットを満たすことだからです。多重度は目的ではなく道具に過ぎないということを忘れないでください。
[9]: スループットの算出方法には、実績ベースと机上ベースの2通りがあります。実績ベースでは、既存や類似のシステムのアクセスログを集計して算出します。一方、机上では処理の集中率などパラメータを仮定して算出します。当然、実績ベースのほうが精度は高くなります。
