ISUCON10 で予選敗退しました
はじめに
ISUCON の問題作成、サーバー準備および運営をして下さった ISUCON 運営の方々、本当ににありがとうございました & お疲れ様でした
おかげで、今年も濃密な 1 日を過ごすことが出来ました
本選も頑張って下さい (参加できないですが…😭)
ということで、やったことをつらつらと書いていこうと思います
今年も@Konboi, @tkuchiki, @hilotter とチーム「流れ弾」で参加しました
役割
例年どおり
アプリ: @Konboi, @hilotter
インフラ周り: @tkuchiki
にやってもらいました
事前準備
インフラ担当の@tkuchiki が事前にインフラの設定ファイルの用意だったりデプロイ周りの整備をしてくれていました (いつも感謝です
自分は過去問を解きながら shogo82148/go-sql-proxy
や masibw/go_one
の準備だったり使ってみたり、最近は仕事で Redis を使わなくなったので redis を go から使う方法を復習したりしました
また、今年はコロナ禍の影響もあってそれぞれ家からリモートで参加することになったので Google Meet で繋ぎながら必要あればホワイトボード代わりに miro を使い、事前に全員で 1 回使ってみました
当日
開始前 (~12:00)
お昼とか飲み物を買いにコンビニから帰ったら開始延長のアナウンスがあったので、
- 👶 の午前のお昼寝の寝かしつけ
- 夕飯の具材の買い出し
等をして休日のお父さん業をしてましたw
11:30 過ぎには PC の前で待機完了
競技開始
大きくやった事としては
- MySQL 8 にする
- nazotte の loop クエリをコードで解決する
- stock 0 の chair は削除する
- search の range のクエリ修正
- chair/estate の追加を bulk insert
- chair/estate で DB を分ける
- feature の正規化 (時間切れ)
MySQL 8 にする
序盤で tkuchiki が MySQL8 に
降順 index を使用
nazotte の loop クエリをコードで解決する (Konboi)
http://rosettacode.org/wiki/Ray-casting_algorithm#Go を見ながら緯度/軽度情報からマッチしているかをチェックするように変更
今思い返してみると最初の esate 取得時に Limit 制限書けてなかったので limit つけても良かったかもしれない
stock 0 の chair は削除する (hilotter)
追加がなさそうなので where stock > 0
なクエリを消せるので削除するようにした
search の range のクエリ修正 (Konboi, @tkuchiki)
range 情報をもとに range id が 0,3 のときにも 0 < price
なクエリが追加されるように修正
chair/estate の追加を bulk insert (Konboi)
購入や情報取得に繋がらないのは新規データの追加が遅いからでは?と邪推 & insert が loop クエリだったので bulk insert するように変更
ここまでで 700 前後
estate/chair の DB 分割
DB の CPU 使用率が依然としてたかく、join もなかったので chair と esate で DB を分割
これで 1300 前後
feature の正規化 (時間切れ)
hilotter が ruby で正規化に成功したが go に移植すところで時間切れ
スコア
反省点
- index を貼るのが遅くなってしまった & 網羅できてなかったかもしれない
- ポータブルがメンテ == ベンチも動かないと勘違いしてしまった
- インフラ周りを全部 tkuchiki に頼りっぱなしになってしまった
- 自分の役割分担の依頼がぶれてしまった
- なんか裏ワザ的なブレイクスルーがあると勘ぐって実装が足りないことから目をそむけてしまった
- 今回は普段触っている言語が違うので go/ruby でいこうとなったけどやるなら endpoint ごとにやらないといけないのでコストが高い
- etc
と反省が多いですが次に繋がるノビシロがあるということで…
さいごに
ほぼ 1 日、ワンオペになってしまったが嫌味ひとつ言わず対応すてくれた嫁さんに本当に感謝です
本選にいけなにのは悔しい…来年に向けてまた精進しよう