VTRyo Blog

一歩ずつ前に進むブログ

【ISUCON12初出場】悦びと屈辱の狭間で。 〜初期状態がチームハイスコアなんて信じたくなかった〜

専門家とは、非常に狭い分野で、ありとあらゆる失敗を重ねてきた人間のことである ――ニールス・ボーア

2022年7月23日にISUCON12が開催された。

今回初出場であったが、出場するきっかけをくれたのは、ISUCON9で優勝した@rosylilly氏であった。

出場前時点での大会に対する印象と、実際に出場してみての印象は大きく変わった。

楽しさあり、悔しさあり。これはコンテンストなのだ。社会人になってから、学生の頃は身近にあった勝ち負けといった概念から切り離されていた(僕はオンラインゲームとかもしない)。 仲間がいて対戦相手がいるという状況は、自ら望まないと出会えない。

ISUCONはたくさんの感情をくれる大会だった。

大会前

ISUCON12に出てみようと思ってからチームメンバーを探した。

お互いの人間性とスキルセットがわかっている方が良いというアドバイスから、同僚か元同僚だなと思い、とりあえず仲が良かった前職のメンバーに声をかけることにした。

ということで、元同僚_最新_最終版コピー(2)_old決定版.xlsxチームを結成(元同僚という名前は別のチームに取られていた)。

3名は同じ職場ではあったが、同じチームとして働いていたわけではなかったので結成後に時間を取って過去問の素振りをするなどの練習時間を取った。

選択言語は迷ったがRubyにした。これも前職がRuby on RailsでSaaSを提供していたことからくる。使い慣れた言語で試合に挑むことは定石だと思った。
もう少し時間があれば別の言語でもよかっただろう。

しかしこの言語選択は後に残酷な気持ちになる伏線となってしまった。

大会当日

ライブ中継をメンバーとみながら競技開始時間を待った。

www.youtube.com

ISUCONにはテーマソングがあり、これがめっちゃかっこいい。

www.youtube.com

今回の「いい感じにスピードアップ」すべきサービスが紹介される。もちろん8時間後にリリースだぜ^^

テーマはISUPORTSというマルチテナントSaaSだ。ISUCONのシステムをSaaSとして企業に提供するという売りである。 過去問を見るにtoC向けが多かった印象だったので、toBを想定したSaaSが来たのは驚いた。

そして10:00になり、競技は開始された。

ログ

プライベートリポジトリの作成や、すでに公開されているレギュレーション読みは事前に済ませておいた。

10:00からは大会マニュアルとサービスマニュアルを読んでいくことにした。

これはざっと取っていた作業ログのコピペ。


  • [x] Git initする
    • [x] webappをgitにPushする
  • [x] isuconルートディレクトリにvtryo-toolsをcloneする
    • [x] setup
    • [x] Slack通知の設定
  • [x] 分析ログの整備(結構時間かかってしまった)
  • [x] インフラ構成の把握
    • [x] mysql 8.0
    • [x] nginxの設定をいじる
    • [x] redisが動いている…?
    • [x] 12:20 テナントのDBはSQLite3になってることに気づく
  • [x] 13:38 エンドポイントの得点傾向を見直して、修正すべき箇所をOrganizorに変更していった
  • [x] 15:02 アプリケーションコードを見ながらDBのコンバートを実行。結構かかっている様子
  • 15:17 チューニングしたいのだけど、アプリケーションのプロファイラの設定に時間を取ってしまいなかなか進まない
  • ローカルでDocker環境を再現できなかったりと分析したものを手元で検証する土台が整っていないモヤモヤ感を抱えたまま時間がすぎる
  • 15時57分 SET GLOBAL max_allowed_packet = 500000000; に変更。※1,2台
  • [x] 16:28 DBのBulkコンバートが完了する
  • [ ] 16:29 プロファイラしたいのにやはりGemfileがうまくインストールできない様子
  • [ ] 17:06 id発番をSecureRandom.random_number(1 << 64)に変えようとするがうまくいいかず
  • [x] 監視用でポートをこじ開けていた分を戻す

【追記】メンバーのエントリを追加

ローカル開発環境がうまく作れず、3台のサーバを1一人ずついじってGitHubにPushして効果があるものをマージするといった策になってしまった。
ぶっちゃけこれは何がベストなのかわかっていない。でも本番サーバを直接いじることがベストだとは、いくら競技とはいえ思えない自分がいる。

それから、試合終了後に他の選手も話していた、アノ問題に我々もぶち当たっていた。SQLite3の移行問題だ。

「こんなバカでかい問題をわざわざ見えるように置いておくなんて囮だろ」
「現実にもこういう誰が作ったかわからんツールだけが取り残されてるやつ見たことあるわ〜」

などと話しているうちに決断に迫られた。あの時点で、アプリケーションチューニングに時間を使うべきだと言うことはできなかった。
3名とも「これは移行しないと前に進めないんじゃないか」と意見は一致していた。一人が移行しながら、別のメンバーがチューニングすればいいだけだと。

しかし結局時間は無残にも過ぎ去り、17:30頃になって最終ベンチを回し始める。


  • [x] ログの停止
  • [x] ポートをこじ開けていた分の切り戻し(env-checkerに引っかかって失格になるから戻せ)
    • [x] Netdataのポート

この時点でインフラ3台をうまく組み合わせるとった余裕も存在していなかった。 こうなりゃ3台の中で一番成績がいいサーバで回せや! ということでやって1999点が最高スコアだった。

しかも、チューニング箇所の当たりをつけていながら効果のある実装がうまくできず、DBも移行しきれず、とすべてが中途半端になっていた。
そう、もはや初期状態と同じだったのだ。(わかりやすいインデックスを貼っていたくらい)

……っべー2000点も行かないの? 8時間何してたの? とブラック上司みたいな詰め方を自分自身に対して向け始めていた。

そして我々は思いつく。

「これ初期状態なんだから、RubyじゃなくてGoに切り替えてベンチ回したほうがスコア上がるんじゃないの」


  • [x] 17:54 Goのほうが早いんじゃねとかいって試しにやったら倍ぐらいスコア伸びた。この8時間はいったい。死にたい

使い慣れていたはずのRubyより、ほぼ使ったことないけど「早いんじゃないの」程度の知識のGoの方がよっぽどハイスコアだったという現実。

もう見てられない。僕らの初めての試合は終わったのだった。

結果

最終結果は3160点で548位中333位だった(失格チームを除く)。予選突破チームおめでとうございます。まじですごいです。

isucon.net

あゝ無情。

それなりにキャリアを積んでるソフトウェアエンジニア3人が8時間格闘して、チューニングしない初期状態が一番スコア高いなんて信じられるか?

試合直後の感想には哀愁があった。

感想

昨今の業務では本番サーバに直接SSHすることもなくなり、yamlを書くだけでDeployができたりサーバがぶち上がったりする。

だからめっちゃ手を動かすISUCONは楽しかった。

でももっとヒリヒリする試合がしたかった。
毎分コミットしちゃうくらい、頭で考えていることが直接指に届くくらいの集中をしたかった。

自分の技術が仕事でしか活きないなんて思いたくないのだ。

我々は試合直後、恐る恐る話をした。

「来年……どすか。出ますか。こういうのってプライベート割と削るので、モチベがあればなんですけど」
「むしろ"お前いらない"って話じゃなければやりたかった」 「やろう」

満場一致で再出場したいに決まった。

ISUCONは思ったより楽しくて、そして、悔しかった。