ISUCON7 予選、出題者チームにてインフラ担当をしている KLab 横川です。

まず、ISUCON7 予選にご参加していただいた多くの皆様、ありがとうございました。
大事な予選にて 1 日目、2 日目ともに開始時刻の遅延という重大なトラブルを発生させてしまったことをお詫び申し上げます。特に予選1 日目の方は告知していた開始時間から 3 時間も遅れてしまい大変申し訳ありませんでした。

このエントリでは、今回の開始時間の遅延原因についてお伝えいたします。

予選のサーバー、ネットワーク構成

まず、問題の概要に入る前に予選のサーバー、ネットワーク構成について紹介します。

予選に参加された方はすでに御存知の通りだと思いますが、今回の予選での構成は 1コア、1GBメモリ、20GBディスクで構成されたサーバーが 3台からなっており、それぞれ別々にグローバルIPを持ってインターネットに接続されながら、内部でのデータベースなどの通信のためにローカルのスイッチでも接続してある構成です。少し複雑な構成ですが、これはリハーサルなどを実施した際に外部ネットワーク経由で遅延が見られたことなどからデータベースは別ネットワークを利用しようということでこの構成になりました。

この構成を今回さくらさんからご提供してただいている「さくらのクラウド」で実現するためにサーバー(+ディスク) スイッチのサービスを利用させていただきました。

また、手動で管理するのは大変ですので、基本的な構築作業は Terraform for さくらのクラウド を利用しています。これはオーケストレーションツールである Terraform からさくらのクラウドを操作するためのプラグインで、利用マニュアルも充実しており、新機能への対応の速さなど含めてとても便利に使わせていただきました。これがなければ恐らくこのような複雑な環境を大量に構築することは難しかったでしょう。作者の方には本当に感謝の言葉しかありません。

ただ、そのままでは予選環境としてさくらさんに用意していただいた専有ホストが利用できないので、 もう一人の予選インフラ担当で去年の優勝メンバーの一人であるはてなの @kizkoh が本家のマージされていないプルリクエストなどから必要機能を実装してくれました。(感謝!)

概要

今回の ISUCON では嬉しいことに参加チームは 400 チームを超えました。

ただ、これだけ参加していただけるチームがあるということは、上記のような構成を 予選1日あたり約 200 チーム分、サーバー台数では約 600 台も用意する必要があるということになります。

この二日間合計 1200 台を用意するのに、我々は完成したデプロイ済みアーカイブ(ディスクイメージを固めたもの)から作成することにしました。1200 台のサーバを先に用意して、それらに対して変更のあったアプリなどをデプロイするという方法も考えなかったわけではありませんが、1200 台のデプロイをうまくするより完成したアーカイブからきれいなサーバーを作成するほうが途中の切り戻しなどで管理が容易なのではないかと考えてこの形を取りました。

本題の実際の参加者向けサーバー構築は、最終リハーサル完了後の前日夕方より作業を開始し最大12時間程度を見込んでいました。これはそれまでの経験上、terrafform を使ってサーバ構築をする際に1時間に 50 から 60 台程度のサーバーを用意することができていたので予選 1日分つまり約 600 台を用意するのに最大で 12 時間、チームごとに作成できるようにしているので並列で実行すれば数時間程度で終わると考えていたためです。

ところが、本番前日に実際の構築作業をはじめてみるとこの目論見はそれほど甘くないことがわかりました。まず、並列での作成に関してですが、terraform から利用するサーバーやディスクの作成 API にスロットルがかかっていて、並列に作成して時間を短縮し翌日に備えるという目論見は脆くも崩れ去りました。それでも開始時間までには全てのサーバーの作成を完了できると見込んでいたのですが、残り百台強を準備すれば完了となる早朝時間帯から午前中にかけては API が混み合っている時間帯となっているようで当初に期待していたような速度で作成ができない時間が数時間続いてしまいました。

原因

この問題の大きな原因は我々インフラ担当者の 1200 台というサーバ台数に対する見積もりの甘さにあります。

予選当日の環境を作るまでは、検証などを目的として 100 台弱までしか作成した経験がありませんでした。ただ、その延長で今回必要な 1200 台を用意できると考えていたのです。そして今回は環境作成後に変更が入ることを嫌ってここまでは大丈夫だろうとぎりぎりまで環境構築作業を遅らせたのですが、その甘かった見積もりから環境構築を実施する作業時間を出して、マージンもほとんど取っていなかったために今回の事態を引き起こしてしまったと考えています。

本選にむけて

今回、予選に参加された方々には ISUCON に対してマイナスな感情を持たせてしまったのではないかと、今までこの ISUCON を作り育ててくださった方々や今回一緒に予選を準備した他のメンバーにも本当に申し訳なく思っています。

予選でのこと教訓として、本選では参加していただいた全員に今回の ISUCON もやはり良かったと言ってもらえるよう、これから @kizkoh とともにしっかりと準備を進めていこうと思います。