📌

スループットを測るベンチマーカーはタイムアウトしてはいけない

2020/10/13に公開

原則としてスループットを測るベンチマーカーはレイテンシを計測するべきではありません。計測する場合もあくまでも参考情報として捉え、スコアに含めるべきではありません。
スループットを測るベンチマーカーでタイムアウトを設定した場合、タイムアウトが発生した時には妥当な性能が測れていないことになります。

これが何故なのかを、レジのスループットを計測するベンチマーカーを例にして説明します。

レジのベンチマーク

レジのスループットを計測するベンチマーカーを設計します。レジが何台あるのかとか、1つのレジで複数の客を並行して処理しているのかとか、レジ待ち行列がどうなっているのかは完全にブラックボックスになっています。
レジに商品を持って並ぶ客(を模倣したボット)をN人(このNを並列数とか負荷レベルと呼びます)用意します。 この客は普通の客と異なり、レジが完了したらまたすぐに商品を持ってレジに並びます。 これがスループットを計測するベンチマークが現実の客と大きく異なる点です。
1分間に100回レジを通ったとすると、このベンチマーク結果となるスループットは100回/分になります。

負荷レベルの重要性

ボットの数が十分でないと、レジ待ち行列が途切れてしまうタイミングが発生します。これが発生するとベンチマークの結果得られるスループットは限界スループット(性能)と解離します。そのため、性能を測る時には行列が途切れないように十分な負荷レベルを用意する必要があります。

ここでも現実世界とベンチマークで異なる点があることに注意してください。現実世界のループしない客を、一瞬も待ち行列がからにならないくらいのペースで流入させ続けようとすると、客の流入ペースが限界スループットを超えることになり、待ち行列は無限に伸びてしまいます。一方ベンチマークでは待ち行列の上限は負荷レベルNで決まります。

なので、十分に大きいNを用意したところで、ベンチマーク対象がパンクすることはありません。

タイムアウトを設定すると何が起こるか

ベンチマーク対象であるレジやレジ待ち行列がブラックボックスなので、ベンチマーカーと協調してタイムアウトを実装することはできません。ベンチマーカーのタイムアウトとは、ベンチマーカー側の一方的な処理です。例えば次のような感じになるでしょう。

  • レジを一定時間に終わらなかったボットを無視する。その後レジを終えてもカウントしない
  • それどころか減点する
  • 負荷レベルNを維持しようとして新しいボットを追加する

このベンチマーカーは無茶苦茶です。レジ側から見るとこうなります。

  • レジ処理を完了しても計測されない
  • それどころか減点される
  • 待ち行列が無限に伸びていく

これではベンチマーカーの本来の目的であったスループットの計測は一切できていません。ベンチマーク対象をパンクさせるだけのDoS攻撃ツールです。

どうするべきか

一番簡単なのはタイムアウトを設定しないことです。

もし「レスポンスタイムの95%tileをTmsec以下にキープできる上限のスループット」を測りたい場合は、レジを完了した客がすぐにまたレジに並ぶ形のベンチマーカーではなくて、一定のペースで客を流入させるベンチマーカーを使い、負荷ペースを変えながら何度もベンチマークを実行します。

例えば wrk がループ型、wrk2が固定負荷ペース型のベンチマーカーです。wrkで純粋な限界スループットを測ってから、wrk2を使ってレイテンシを観ながら少しずつ負荷を下げていくといった方法が考えられます。

繰り返しますが、後者は負荷レベルを変えながらなんどもベンチマークをしなければなりません。本当に必要な時以外は前者でシンプルな限界スループットを計測するだけで十分でしょう。

GitHubで編集を提案

Discussion