🔩 ねじき教室 Go と Web の教室

スコアが動かなくなったら

読了目安 約4分

何を変えてもスコアが同じ帯に収束したときに、何が上限を決めているのかを 2 回のベンチで判別します。

この章の目次

何を入れても同じ点数の帯に戻ってくることがあります。 このとき、直す場所を探し続けるのは無駄です。 何がスコアの上限を決めているのかを、先に確定させます。

数えるのは成功した仕事だけ

サーバーが物理的に処理した件数ではなく、ベンチマーカーが有効と判定した件数を見ます。

エラーを返したリクエストも、検証に失敗した処理も、リソースは消費しています。 それを含めた件数で改善を語ると、「速くなったのに点が下がった」が説明できません。

さらに、規定を満たす範囲での最大を容量とみなします。

  • 検証に通っている
  • エラー率が規定以下
  • 応答時間の上位パーセンタイルが規定以下

頭打ちの見分け方

次の 3 つが揃ったら、上限を決めているのがサーバー側ではない疑いがあります。

  • 大きく変えてもスコアが同じ帯(前後 1 割)に収束する
  • ベンチマーカーの不満の内訳が変わらない
  • エラーがゼロ

ただし、3 つ揃っても打ち止めとは限りません。 実測で、揃ったと判断した帯から、応答時間の削減だけでさらに 2 割以上伸びた例があります。

判別のためのベンチを 2 回

確定させるには、次の 2 つの変更で 1 回ずつベンチを回します。

何をするか結果の読み方
アプリケーションの台数やリソースを増やすスコアが動かないなら、ベンチマーカーが送る同時リクエスト数は固定されている
応答時間だけを削る変更を入れる伸びるなら、上限を決めているのは応答時間

リソースを増やしてもスコアが動かず、応答時間を削ると伸びたなら、全体はこう振る舞っています。

スコア同時リクエスト数1 周にかかる時間 \text{スコア} \approx \frac{\text{同時リクエスト数}}{\text{1 周にかかる時間}}

この形では、リソースを足してもスコアは増えません。 1 リクエストの往復の数と処理時間、つまり 1 リクエストがリソースをどれだけ使うかVVSS を削ることだけが効きます。

リトルの法則を逆に使っても確かめられます。毎秒の件数と平均応答時間を掛けた値が変更しても一定なら、それが固定された同時リクエスト数です。

疑う相手を間違えない

頭打ちに見えて、別のものが犯人であることがあります。

計測の道具そのものを容疑者に入れます。 プロファイラやログ収集の常駐プロセスが CPU の上位に来ることがあり、実測ではログの転送だけで CPU の 7 割を使っていた例があります。 計測ツールが足を引っ張っているなら、止めてから測り直します。

速くしたせいで下がることがあります。 応答が速くなるとベンチマーカーは負荷を増やすので、増えた書き込みを捌けずタイムアウトに変わることがあります。 さらに、それまで遅くて実行機会が少なかった処理が回るようになり、最初から潜んでいたバグが一気に表に出ます。 スコアの内訳を変更前後で差分して、減った項目を特定します。

エラーがどの層で出ているかを確定します。 サーバー側のアクセスログのステータス分布と、アプリケーションのエラー件数が食い違うなら、差分はアプリケーションに届く前に返されています。

仮説は計測で棄却する

原因の見当がついたら直す前に、「これが本当なら、次のベンチでこの数字がこう動くはずだ」を先に書きます。 直したのにその数字が動かなければ、仮説は外れです。 別の原因を探し直します。

直したことで説明のつかない改善が出た場合も、同じくらい疑います。 偶然だったものを効いたと記憶すると、本番で間違った引き出しを開けます。

試してみよう

次の状況を考えてください。

  • 3 回続けて別々の改善を入れたが、スコアはいずれも 18,000 前後
  • ベンチマーカーの不満の内訳は 3 回とも同じ
  • エラーはゼロ
  1. この 3 つが揃っただけで「打ち止め」と判断してよいでしょうか
  2. 確定させるためにベンチを 2 回回します。それぞれ何を変えて回しますか
  3. リソースを増やしたほうはスコアが動かず、応答時間を削ったほうは 22,000 に伸びたとします。次に手を入れるべきなのは何ですか
答えを見る

1 はだめです。 この 3 つは「サーバーが悲鳴を上げていない」ことしか示しません。 たとえばベンチマーカーが 100 並列で送り、1 周 500 ミリ秒なら毎秒 200 周です。 サーバーはどこも飽和していないのに、スコアは 200 周ぶんで頭打ちに見えます。

2 は「アプリを 1 台足す」と「1 周を短くする変更(たとえば往復を 2 回減らす)」です。 前者で伸びれば、単にサーバーの容量が足りていません。 後者だけで伸びれば、上の 100 並列の系です。

3 の状況はまさにそれで、1 周が 500 ミリ秒から 410 ミリ秒に縮んだ計算です(18,000 × 500/410 ≒ 22,000)。 リソースを足しても 100 並列は増えないので、以降は 1 周を縮めることだけがスコアに効きます。

判断を書き留めてから回してください。 外れたときに、何を勘違いしていたのかが残ります。