9 月 22 日の朝、torun.ai はほとんど動かなくなりました。自動化されたブラウザーの集団が、45 分で 2,000 を超えるアドレスから公開ページを一つずつ要求し、最悪の 1 分間では毎秒およそ 3 ページに達しました。ウェブサイトなら何事もなくこなすべき量です。当社のサイトはこなせませんでした。最も混んだ時間帯にはリクエストの 4 分の 1 以上が 30 秒を超え、数百人の来訪者がページの表示を待たずに去りました。
想定していた負荷ではなかった
まず疑ったのはクローラーとプロセッサーでしたが、どちらも当てはまりませんでした。同じ毎秒 3 ページをサイトの複製に再現すると、1 分ももたずに、その後は何一つ完了しなくなりました。プロセッサー使用率は 60% から 1% に下がり、スレッド数は 12 から 166 に増えました。過負荷のサーバーは働き続けますが、このサーバーは待っていたのです。
語ごとの往復
1 ページの生成中にキャッシュサーバーを観察すると、何を待っていたかがわかりました。1 ページがそこへ 585 のコマンドを送り、そのうち 428 は同じ参照とその更新の繰り返しでした。当社のサイトでは空の翻訳テーブルです。ページ上の翻訳済みテキストの一つひとつが、そしてページには数百あります、それを改めて要求し、要求のたびに応答が返るまでスレッドを一つ占有していました。毎秒 3 ページでスレッドが尽き、すべてがその後ろに並びました。
修正と上限
これらの参照は現在、1 分ずつメモリから返され、期限切れの際に一度だけ取得し直し、翻訳を変更したサーバーで消去されます。同じページが送るコマンドは 585 から 31 になりました。ページ生成の前には上限も設けました。同時に生成するページ数は固定で、短い待ち行列が待機し、それを超えた分にはすべてのページを遅くする代わりに、すぐに「しばらくしてから再試行してください」を返します。
本番環境で計測
9 月 23 日のリリース後、稼働中のサイトを改めて計測しました。ページ生成の中央値は 249 ミリ秒から 42 ミリ秒に、20 件中もっとも遅いものは 2 秒近くから 72 ミリ秒になりました。1 ページあたり 214 回実行されていた参照は、今は 1 回です。
書き留めた教訓は単純です。処理能力の数字は信念ではなく計測です。公開サイトがどこまで耐えられるかを、私たちは一度も試していませんでした。今は試しましたし、数字を示す前にはまた試します。