allegrogiken というIDでAtCoderをやっている松崎です。
タイトルの通り今年も ISUCON の季節がやってきて、颯爽と過ぎ去っていきました。
運よく参加することができたので、軽いレポートをまとめてみました。

参加チーム名は「新大阪うどん屋(仮)」で、最終スコアは 3454 でした。

目次

  • 0次予選(参加登録)
  • 事前に準備したこと
  • 予選の中でやったこと
  • 参加してみた感想

0次予選(参加登録)

ISUCONに参加するには「参加募集期間にISUCONポータルで参加登録をする」必要があります。それ以外の手続きは必要ありませんが、参加登録は早い者勝ちとなっています。ものの数分で募集が終了してしまうこともあるので、まずはここで覚悟を示す必要があります。

私は3回目の募集でギリギリ参加登録することができました。土曜日の午前中だったので、起床できなかった人が多かったのかもしれません。
1人で参加するのも勿体無いかな?ということで、過去の同僚を一人誘うことに成功しました。2人チームです。

事前に準備したこと

事前学習については世の中にたくさんの記事が溢れていると思いますので、ここでは省略して準備にフォーカスします。あまり学習をしなかった、というわけではありませんよ?

ISUCONは8時間しかありませんので、コミュニケーションやコード管理をする場をコンテスト中に用意するのは勿体ないです。事前にできることはやってしまいましょう。

Gitリポジトリ

公式の座学が詳しいです。プライベートリポジトリを作っておき、チームメンバー全員が操作できるようにしておきましょう。ISUCONが始まったら、配布されるサーバ内で秘密鍵を生成して deploy key として登録すると良いです。

コミュニケーション

リアルタイムの会話に Discord, ドキュメンテーションに Scrapbox を使いました。
Discord は音声通話もできますし、GitHubのPushをWebHookで受け取ったりできるので大変便利です。
Scrapbox では AWSアカウントなどの事前情報をまとめたり、担当タスク単位での雑多な思いつきを書き連ねたりしました。終了後のふりかえり会場にも使えます。

監視基盤

あまりこの分野に強くないので、公式でも紹介されていてサポータープログラムの提供もある New Relic を事前に準備しました。インストールはワンライナーで終わりますし、GoアプリケーションのAPMを導入するなども比較的簡単にできます。

予選の中でやったこと

午前中の2時間はこんな感じで終わりました。サーバが3台分あるので雑務も3台分。

  • CloudFormationテンプレートの展開
  • New Relic エージェントのインストール
  • サーバ全体に何があるかざっくり把握
  • Git管理する対象物を決めてコード管理
  • リモートリポジトリと連携できるようにする

午後は本格的にコードを弄りましたが、大きな改善にはつながらず。
業務要件がそこそこ複雑、というのもあって整合性チェックエラーを繰り返していました・・

  • リーダーボードのクエリ改善
    • テナントDB(SQLite) に index を貼った
    • CSVファイル内で重複したユーザの行は無視して、最後の奴だけ insert するようにした
    • ページングをSQLの LIMIT, OFFSET でできるようにした
  • キャッシュが効きそうな奴は nginx でキャッシュする
    • チームメイトが頑張っていた。あまりうまく効いてくれなかった模様

最高で4000程度のベンチマークスコアが出たこともあって盛り上がりましたが、最終的なスコアは 3454 と落ち着いた数字になりました・・ 計測しているとわかるのですが、ベンチマークスコアはそこそこ誤差があります。

参加してみた感想

ボトルネックを見つけるのは難しい

全然改善できなかったなぁ〜 というのがまず第一の感想でした。アクセス比率から改善対象のページを絞っていたのですが、それらはあまりネックではなく大きな改善に繋がらなかったのだろうと思います。

「インデックスを貼る」「N+1を解消する」みたいなのは典型だと思うのですが、高々データ量が100件前後みたいな場合だとあまり成果になりませんね。どのテーブルにどれだけのデータがあって、スロークエリはこれで・・ みたいな分析は最初に必要かー。となりました。

問題設定の面白さ

初期のコードがいい感じに業務的な汚さを含んでいて、とてもリファクタリングしたくなりました・・ リファクタリング欲との戦いが大変です。単体テストが無い中でのリファクタリングはやめましょう。

インフラ的?には、 MySQL + SQLite と、テナント単位でサブドメインを発行するタイプのサービス・・ ということで、かなり面白い問題設定でした。そしてテストが大変。

ISUCON の運営とコミュニティについて

ISUCONの参加者は、専用の Discord サーバに招待されます。そこで事前準備などのやりとりを行いますが、それだけではなく純粋なコミュニティとして機能していますね。

終了後も参加者による雑談が頻繁に行われていて、見ているだけで得られる知見がたくさんあります。これだけでかなりの価値があると思ってしまいます・・

来年は?

0次予選に勝てればまた参加したいですね!次回はたくさんの過去問と触れ合ってボトルネックを見つけるのを上手になっておきたいです。
無理そうだったら、他言語に移植するボランティアでもやろうかな?と思います。