RightTouchのエンジニアでISUCON14に初挑戦してきました

先日行われたISUCON14にRightTouchのエンジニアメンバーikki, nari, takkenの3名で、チームnarinariとして参加しました。

結果は12728点で831チーム中97位 となりました。
利用言語別のNode.jsでは9位にくいこむことが出来ました。

当日の点数遷移としてはこんな感じです。

isucon01.webp

0次予選

ISUCON14は予選がなく、何回かに分けて先着順での参加申し込みでした。

最初の申し込み回は結果的に秒殺でしたが、秒単位で時間を確認しつつ、チーム名は一旦適当につけることでなんとか滑り込むことができました。冒頭にもあるように結局名前はこのままで行きました(笑)

isucon03.webp

練習

全員が初参加ということで、当日ぶっつけ本番というわけにも行かないので、本番前に2回ほど練習会を行いました。

練習ではmatsuuさんのこちらやISUCON本のprivate-isu使って練習しました。また、traPさんのこちらも非常に参考になりました。

主に行ったのは下記です。

  • 基本的なインスタンスのセットアップ手順
  • 以降の練習 or 本番に向けた作業メモを残す
  • 競技中によく叩くコマンドをMakefileにまとめる

セットアップをする中でつまづいたポイントや、回ごとに異なりそうな部分は当日に焦らないようにコメントを残しておくことで再利用しやすくしました。

ISUCON14の出題概要

ISURIDEという椅子のマッチングサービスが題材でした。いわゆるタクシー配車アプリの椅子版で、ユーザーが椅子をリクエストすると周りにいる椅子とマッチングし、座ることができるというものです。

詳しくは動画をご覧ください

当日の流れ

午前

ikkiがインスタンスのセットアップを担当し、nari,takkenでドキュメントやコード読みとAPMのセットアップなどを行いました。

2台目のインスタンスセットアップ時にコマンドのコピペをミスり、環境を壊してしまい、インスタンスを作り直すなどのトラブルはありましたが、12時ごろにそれぞれのインスタンスのセットアップを終えて、ベンチを回して点数が出ることを確認しました。

また、当初はgolangで参加する予定でしたが、やはり慣れている言語にしようということでnodeにすることにしました。結果的に今回はアプリケーションロジックの改善がメインだった(はず)ので慣れている言語にしておいて良かったです。

12時-14時

APMにたまったデータをもとに一旦遅いSQLたちにINDEXを貼る儀式を行い、数百点アップしました。

そこから、各自コードを読み進めたり、実際にアプリを触ってみたりして、やたらとリクエスト数が多いエンドポイントやN+1になっているところを発見し次第、改善を試みるという形で進めていましたが、なかなかうまく改善が進まない時間が続きました。

流石にこのままだと厳しいと思い、一旦集合してモブプロ的に大きな課題を潰そうという方針に変えました。

15時

見つけた大きな課題を全員で取り組むスタイルに変え下記を改善しました。

  • 都度計算している重い処理をカラムとして保存するようにスキーマ変更
  • DBとAppのインスタンスを分ける
  • Honoのリクエストログを止める

この辺の取り組みをして大体8000点くらいまで上昇しました。

ほぼ初期スコアの時間が長かったのでちょっとホッとしました。

16時-17時50分

もう一つくらい改善できるかなと思い、次にライドの不満度に目をつけました。

初期だとランダムに椅子をマッチングさせていたところを現在地から近く、スピードが速い椅子をマッチングさせるようにロジックを変更しました。

追加でいくつかINDEXを貼ったりして、17時くらいに12000点強位まで上がりました。

ラスト10分

なんやかんやでギリギリまで改善をしていて、再起動試験などをしないととなり、大急ぎで行いました。

幸い特に問題は起こらず、不要なサービスの停止まで完了して18時を迎えました。

感想

下記はISUCON14に初参加して感じたポイントです。

  • 事前練習は必須
    • 練習なしだったら諸々のセットアップで大半の時間を消費していた可能性があります
  • 何事もイテレーションサイクルが短いことが重要だと感じた
    • VSCodeのmysql拡張がSSH時にもいい感じに使えて、コードからクエリをコピペするとどんなデータが返ってくるかわかったり、書いたクエリが動くのか都度確認できて良かったです
  • 分担にはかなり慣れが必要そう
    • 私たちのチームは結果的にモブプロ的な形で進めた方が早かったです

ほぼ初期スコアの時間が結構長く、内心焦りつつ最終的にはいくつか改善できたので初参加としては良かったと思います。

弊社から出ていた別チームと打ち上げに行き、感想戦をしていたところ、コスパ良く改善できるポイントを取り逃がしていたことを知り、若干の悔しさを残して初めてのISUCONは終了という感じです。

最後に

RightTouchでは、プロダクトのパフォーマンスにこだわるプロダクトエンジニアを絶賛採用中です。
少しでも興味を持った方がいればぜひお話ししましょう!

エンジニア求人情報の詳細
https://righttouch.co.jp/jobs/engineer

採用サイト
https://righttouch.co.jp/recruitment