ISUCON 初参加!
ISUCON10に参加してきました!
こういったコンテスト(競技プログラミング)自体初めての参加だったのでとても有意義な体験でした!
この記事では自身の体験とともに、 ISUCONって一体何なのかについてもご紹介できればなと思います。
ISUCON とは
いい感じにスピードアップするコンテスト (Iikanjini Speed Up CONtest)
の略で、お題のWebサービスを、決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです。
参加者はただひたすらにお題として与えられたWebシステムを高速化するのみ、 限られた時間 (8時間!!)
を使って、いかにそのシステム全体を読み解き、理解し、パフォーマンスを上昇させるかに尽力します。
予選と本戦に別れており、前哨戦である予選を勝ち抜けるのは 全体のうち 30チームのみ!
最近では学生さんの参加があることもあり, 一般枠と学生枠に更に別れており
一般は25チーム、学生さんは5チームが選出されます。
優勝賞金は100万円! という太っ腹な大会です。
これまで 計10回開催されており、今回参加したのが記念すべき第10回でした
構成
- 基本的に 複数の言語でシステムが実装されているのでそのうちのどれかを選んでチューニングしていきます。
- 実装言語は 最新のISUCON10では以下のような言語で実装されていました
- Go,Ruby,Python,NodeJs,PHP,Rust,Perl,Elixir,Deno
- 実装言語は 最新のISUCON10では以下のような言語で実装されていました
オンライン予選 利用言語比率
利用率の全体ランキングは以下の通りです。
Go 276組 59.0%
Ruby 81組 17.3%
Python 47組 10.0%
Nodejs 29組 6.2%
PHP 18組 3.8%
Rust 8組 1.7%
Perl 7組 1.5%
Elixir 1組 0.2%
original-ruby 1組 0.2%
-
1~3人までのチームを組み、問題に取り組んでいきます。
- アプリ、インフラ、分析&司令 といったような構成がオーソドックス
-
スコアの測定には独自のベンチマークを使用
- どんな手段でもよいので、以下に高得点のスコアをベンチマークで算出するかがカギ ※ ベンチマークはいじっちゃだめ
今回の問題
issumo という イスと物件を検索し、購入&資料請求できるWebサイトが今回の問題として与えられました。
機能としては以下が主でした。
- イスの条件検索 && 物件の条件検索
- (様々なパラメータを設定でき、それに一致した物件を検索できる)
- なぞって検索 (地図上にマウスでドラッグした指定範囲で物件を検索できる)
- イス、物件のそれぞれの最低価格の一覧表示
- 物件のレコメンド
etc...
今回はログインなどの状態での処理などがなかった為、
純粋にシステムのボトルネックが何なのかを突き止めていくような問題だったと思います。
個人的には 特になぞって検索がすごかった! なぞった範囲の緯度経度をから範囲内の物件情報を表示するUIがよかった...!
当日やったこと
-
アプリ初期動作確認
- 僕の担当はアプリ部分だったので競技が始まってから、まずアプリの動作確認
- 今回は踏み台サーバー経由でのアクセスしかできず うまく接続できなかったため足踏みすることに...。
-
その後
- インフラのチームメイトがソースコードバックアップとgit管理してくれたので、sshはお任せ
- ソースコード読み込み,関数ごとのコメント付け, エンドポイントの書き出しをしていました。
-
DB(mysql周り)
- DBがボトルネックっぽいことがわかったので、index貼ってexplainで計測を繰り返したりいました。
- ただ、indexを貼っても特に結果が変わらず、どうしたものかと頭を抱えたりしてもいました
- チームで相談しもともとはmysql5.7で動いていたものをmysql8に換装 >> 初期スコアから半減するという結果に
- ベンチマーカー回すとデータが初期化され、indexも消えると悩んでいたので schema.sql のテーブル定義に追加するよう提案
-
SQL&レスポンス改善
- 雑に
COUNT(*)
になっているSQLやSELECT *
になってるSQLを改善 - ランディングページで毎回読み込んでいるクエリをRedisに投入してそこから取得するように変更していたりしました。
- OR条件を5連結していたクエリを union で書き直していましたが、結果的にベンチが通らず断念...
- 雑に
まとめ
こうしてまとめてみると当日全然動けてなかったな、というのが顕著にわかります。
自身が普段ほぼフロントエンド専任なのもありますが、圧倒的にバックエンド関連の知識と経験が欠如しているなと実感しました。正直めっちゃ悔しい。
反省点&感想
あとから振り返るとLike検索があった部分や N+1っぽい部分(なぞって検索)をコメントつけている途中で見つけていたのに
他の作業で埋没してしまったなぁというのが反省点としてあります。
また、クエリの改善策がこれといって思いつかず、呆然としてしまった時間があったのでそこがなければ
もう少し手を動かせたのではないか思います。
普段Go触ってないからGoでバックエンドサーバ作ってみるのもいいかもしれません。
何れにせよ実力不足を痛感したISUCONでした...。でもめっちゃ楽しかった!普段触れない言語だったり、いろんな知識を取得できるいい機会でした。
Denoでの実装もあったので typescriptをバックエンドで使用するのもアリだなと思った次第です。
今回DBが物件とイスしかない上、お互いをJOINしているSQLもなかったため、それぞれDBを割り当てるという荒業を行っているチームもありました!思いつくアイデアが既にすごい。。。!
普段土日で開催するものを土曜に集約し、500組もの参加者を捌いた運営さんほんとすごいなと思いました。本当にありがとうございました
予選問題の解説
http://isucon.net/archives/55025156.html にて公開されています!