ISUCON10参加しました
Isucon10に同僚のToshihitoKonと一緒に開運パワーインチームとして参加しました。
名前の由来は社内で一時期流行した内輪ネタですw
去年の新卒1年目では仕事が忙しすぎて参加出来なかったので、2年目で少し余裕出来たし今年は参加するぞ!ということで参戦してみました。
初のISUCON!
弊社は何度かISUCONで優勝したり出題しているレジェンドがいるんですが、できれば同じくらいのレベルのメンバーと組んで自分の立ち位置を知りたいなということで、チームメンバーとして同期のToshihitoKonを誘いました。
一緒に仕事する機会も結構あったのでそういう意味でもコミュニケーション取りやすくて楽しかったですね。
ToshihitoKonはインフラが強かったのでインフラ方面をお願いし、僕はアプリケーションに専念する役割分担で進めました。
使用言語はGoです。
当日まで
ISUCON9の予選をMacのローカルのdockerで動かしてチューニングしてました。
http://isucon.net/archives/53805209.html
また過去高スコア出したブログとか見てみて、戦略を参考にさせていただきました。
https://to-hutohu.com/2019/09/09/isucon9-qual/#%E5%BD%93%E6%97%A5
その結果、alp
pt-query-digest
の使い方あまり慣れてないなというのと Nginx
わかんないなと思ったので、ISUCON9予選を題材にアクセスログとったりスロークエリログの解析をしてみたりしていました。
後は定番のカンペ作ったり、gitリポジトリ事前に用意したりとかですね。
個人的にNginxの理解が足りなかったので、以下の書籍を一通り読ませていただきました。大変参考になった。
nginx実践入門 WEB+DB PRESS plus
Isucon9予選過去問では手元で10000点近く出せたので、これでいいかなということで当日へ。
前日ToshihitoKonの家に泊まってピザパーティで決起会をして、お祭りっぽい感じでワイワイできました笑
当日
ToshihitoKon がインフラの設定などスムーズに終わらせてくれたのでアプリのチューニングに専念できました。
DBの設定やら複数台構成はToshihitoKonに任せて、アプリのチューニングをすることに
- レギュレーションの熟読
- とりあえずbotをはじくためにNginx側で正規表現書くことに
- Nginxの勉強した成果が早速出て個人的にはとてもうれしかった。
- その後DB構造やアプリケーションを読んで全体を把握
- アプリケーションやDBがとてもシンプルでびっくりした。問題に集中できる仕組みになっていて競技が捗りました!
- ひたすらログとにらめっこしてindex貼ったり、遅いエンドポイントを特定。
- どう考えてもイスと不動産の検索が遅い。
- とりあえずindex貼ってみた
- indexそのまま貼れないことが多かったので、アプリケーションの変更を試みるなど
- DB側でorder byしているのを自前でソートするように変更してみた
ここら辺で650くらいはスコア出たんですが、そこから伸び悩み・・・。
他チーム見てみても、クリティカルなボトルネックを解消しないとダメそうでした。
なぞって検索を高速化する or オンメモリキャッシュするの2択かなと思い、事前に勉強してたオンメモリキャッシュに挑戦してみましたが、バグをつぶし切れず、導入には至れませんでした・・・悔しい!
結果的に650点程度でフィニッシュでした。
参加してみて
講評を読んで
http://isucon.net/archives/55025156.html
講評見てみても、なぞって検索の高速化にチャレンジするのは大事だったなと思いました。
また、検索が複雑なところをオンメモリキャッシュにしてアプリ側で検索実装する戦略しか思いついてませんでしたが、普通に検索条件全てに対してindex貼ってしまうという手もあったんだなぁと。
index闇雲に張るのは良くないと思い込んでいましたが、一回試してみてから判断すべきでした。まさに推測するな計測せよ、ですね。
また降順と昇順でソートしていることによるindexが効かない問題は把握してたんですが、これを新しくカラム追加して対処するようにすればよいというのはとてもなるほど!となりました。
バルクインサートの高速化も気づいてたんですが、ログを見る感じそこまでアクセス来てなかったので放置してました。おそらくボトルネック解消すると次にそこが問題になっていくんだろうなと思います。
学び
普段仕事しているとアプリケーション寄りの仕事が多く、なかなか一からNginxの設定書いたりすることも無かったので、ISUCONに参加することでインフラの知識が数多く身に着いたのがとてもよかったように感じます!
また、今の仕事ではコードリーディングして既存の仕様を基に設計を考える時間の方が圧倒的に多く、手を動かしてコードを書く能力が不足しているなと反省しました。
講評を読んでも、ボトルネックの特定はかなりうまくいってそうだったので、あとはそれを「どう解消するか」という実装力の不足を如実に感じるISUCONになりました。
普段の仕事だけでなくプライベートでもコードを書く機会を増やすぞ!というモチベーションにつながりました。
最後に
運営の皆さん楽しい問題をありがとうございました!!このレベルの作問や大会運営を行うみなさんのスキルセットと姿勢にとても感動しました。自分もいつかそうなれるように精進していきたいですね。
また一緒に参加してくれたToshihitoKonありがとう!来年リベンジしような!