ISUCONに初参戦しました
tknzkさんにお誘い頂きISUCON予選に初参加しました。
結果はtknzkさんのブログにもある通り予選敗退
最終スコアは3,910とトップと10倍近い差で、自分の未熟さを思い知らされました…
やったこと
インフラ周りはtknzkさんにやって頂いたので、自分はアプリケーションのコードを読んで改善点を考え実装する係でした。
その中でやったことは下記
- .ruby-versionのセット
- mysql2-client-general_logを導入し、sinatraのクエリログを見える化
- /new_items.jsonのN+1をどうにかする(ひたすらLEFT JOIN)
- /new_items/:root_category_id.jsonのN+1をどうにかする
- /new_items.jsonページ向けに、itemsテーブルに複合インデックスを追加
- /users/transactions.jsonのN+1の解消
結果的に、JOINとADD INDEXしかしてない…
学んだ点
力の入れどころを間違えない
最初の環境構築とクエリ見える化で1.5時間ほど使った後は、/new_itemsのN+1を潰すのに結構な時間を使いました。
結果的にレスポンスタイムは10倍以上高速化したのですが、最終的な結果では、/users/transactionsのスコアが悪すぎました。
/new_itemsの方は素早く切り上げ、/users/transactionsの方に早めに注力すべきでした
ミスをしない
ベンチマークを走らせてエラーが出た時にステータスコードくらいしかわからず、エラーの原因追求に時間がかかりました
ローカルで再現すればまだしも、ベンチマークでしか再現しないものがあり、それがなぜ起きるのかわからず、2時間くらい費やされた…
revertめっちゃした…
エラーの詳細が全くわからないので、小さい単位でベンチマークを走らせるのが大事だなと思いました。
測定は自分でもできた方が良い
アプリケーションのコード改善は、自分と@ykarakita さんがメインでやっていましたが、ベンチマークを走らせて、スコアの計測はtknzkさんにお任せでした。
ただこれだと、毎回マージするたびに、ベンチを走らせていただき、結果が出るまで自分自身それほど集中できないので、自分で測定までできたらよかったなと思いました。
技術を腹落ちさせる
1番の学びはこれでした。
知識として知っていても、実務レベルで使えるようになっていないと全く意味がないと思いました。
非同期化という言葉や概念は知っていても、じゃあそれをどうやって実現するのか、どんなGemやツールがいるのかを理解して、実装できるレベルまでなっていないと、どうにもならないことを痛感しました
普段はRailsを書いているので、意識しないことが多いのですが、もう少し、自分の使っているツールの中身の理解と、手を動かしてみることが大事だなと感じました
ISUCONを終えて
自分の未熟さを十分に思い知らされましたが、ISUCON自体はすごく楽しかったです!
JOINとADD INDEXで、1000点くらいしか貢献できませんでしたが、それでも自分の改善を入れてスコアを伸びる喜びを味わえてよかったです
来年はパワーアップして、また参加したいなと思いました
ISUCON運営の皆さま、本当にありがとうございました!!