0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ISUCON10予選に参加してきました!

Last updated at Posted at 2020-10-16

ISUCON 初参加!

ISUCON10に参加してきました!
こういったコンテスト(競技プログラミング)自体初めての参加だったのでとても有意義な体験でした!
この記事では自身の体験とともに、 ISUCONって一体何なのかについてもご紹介できればなと思います。

ISUCON とは :thinking:

いい感じにスピードアップするコンテスト (Iikanjini Speed Up CONtest)
の略で、お題のWebサービスを、決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです。

参加者はただひたすらにお題として与えられたWebシステムを高速化するのみ、 限られた時間 (8時間!!)
を使って、いかにそのシステム全体を読み解き、理解し、パフォーマンスを上昇させるかに尽力します。

予選と本戦に別れており、前哨戦である予選を勝ち抜けるのは 全体のうち 30チームのみ!
最近では学生さんの参加があることもあり, 一般枠と学生枠に更に別れており
一般は25チーム学生さんは5チームが選出されます。

優勝賞金は100万円! という太っ腹な大会です。

これまで 計10回開催されており、今回参加したのが記念すべき第10回でした :clap:

構成

  • 基本的に 複数の言語でシステムが実装されているのでそのうちのどれかを選んでチューニングしていきます。
オンライン予選 利用言語比率
利用率の全体ランキングは以下の通りです。

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を貼っても特に結果が変わらず、どうしたものかと頭を抱えたりしてもいました :expressionless:
    • チームで相談しもともとはmysql5.7で動いていたものをmysql8に換装 >> 初期スコアから半減するという結果に :scream:
    • ベンチマーカー回すとデータが初期化され、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組もの参加者を捌いた運営さんほんとすごいなと思いました。本当にありがとうございました :smile:

予選問題の解説

http://isucon.net/archives/55025156.html にて公開されています!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?