ISUCON 10 に初出場した
かねてから気になっていた、 ISUCON に初出場しました。@po3rin さんに誘っていただいて、 @_moricho_ さんと、 3 人で初出場しました。
「初参加で予選突破!」だとしたらかっこよかったのですが、しっかり予選敗退で、「おれはまだまだ伸びしろがあるなぁ!(涙)」とおもった一日でした。ベストスコアは1150あたりでFinでした。
事前準備
全員初参加だったので、予習会に参加していてインプットの多かった @_moricho_ さんに戦略を同期してもらいつつ、実際に ISUCON 9 を過去問でやってみる会を行いました。
とりあえずこれをやっておいてよかった。5時間くらい集中してやって、普通に環境構築で終わってしまい、そこで「なぜスコア0がたくさんいるのか」を理解しました。感覚的には、「いかに最速でオンボーディングを済ませて、仕事を始められるか」みたいな戦いだなと。
そこから各自 ISUCON 9 のスコアを最低5000くらいまではあげようねと解散、自習をしました。
その際、@po3rin さんが GCP 環境をさくっと作れるように Terraform を準備してくださったので、本番の開発環境でも練習通りに最低限のミドルウェアとツールが入ったインスタンスを立てる段取りがつくようになっていました。
あと、 Makefile で便利セットアップや、slowqueryのon/off、alp のアクセスログ計測コマンドを用意したり、githubにsshキー登録をしゅっとやる shellスクリプトを用意したりしていました。
$ make help
help Show options
setup setup initial packages
add-docker-group add user to docker group
create-app-user create application user
load-nginx load nginx config and restart (specify NGINX_LOCAL_CONF)
logrotate run logrotate
alp-access-log cat alp access log summary
reset-nginx-log reset nginx log
load-mysqld load mysqld config and restart
slowquery-on turn on slowquery
slowquery-off turn off slowquery
digest-query digest query
reset-slowquery-log reset slowquery log
pprof post slack pprof
which-os confirm which os
当日
当日、オフラインで集まってやろうということで、所属企業の会議室を一室借りて集まりました。
当日朝 8:30 に集まり作戦会議。役割分担とか当日ガイド・レギュレーションの再確認、どういう時間の過ごし方をするか、などをざっくり。
特に明確に決まっていなかったけど、思い返せばこんな感じだった気がする。
moricho: infra中心(結果ほぼインフラ類見ていただいた)
po3rin: application中心(nazotteのN1解消とか!!!)
hgsgtk: DB関連中心・雑用(序盤は情報問い合わせ見たり、終盤はデプロイとベンチ実行)
当日使っていたホワイトボードをガツリ見せ。
ざっくりチーム全体としてできて効果が見えたことはこんな感じのラインナップ
DBを estate chair で分けて分離 / nazotte の緯度経度検索のN1解消 / 現在のクエリから必要そうなDB Index / 変更頻度の少ないデータのメモリキャッシュ / json encode が重かったのを goccy/go-json でエンコーダ置き換え
効果が確認あったのかわからなかった系として、
bot からのアクセスを弾く・N+1の INSERTクエリをBulk Insert に・MySQL conf tuning
終盤に「これやればスコアあがるのでは!?」みたいなノリで快速特急で実装していたりしたときのハイライトがこちらでした↓
「わんちゃんうごいてほしい」で動かなくて、「ワンちゃん治ってほしい」で治りました ;) 実家のワンちゃんに会いたくなりました。
DBを estate chair で分けて分離 がみなさんの感想戦見ても一番効果がありましたが、それに気がついたのは 19:00 - 20:00 くらいだったので10分強かなくらいで初期化処理(遅くなりすぎないように並行処理にしつつ)・データベースのconnection pooling を2つはって、handler類はそれを使い回す、DBを2台疎通するようにするを、3人でやった感じでした。
もっとできたな...ってところ
ISUCON 9 とかは、露骨な N+1 がいろいろな箇所に散りばめられていたのですが、今回はDBの性能自体が問題になる、という傾向にありました。
DBがあるインスタンスのCPUが100%張り付いて、mysqldがボトルネックってところまでは早期にわかったものの、そこから有効打を打つまでに時間がかかりました。
の記事を見て xxxRangeId カラムを追加 のアイデアなど、そもそもの前提から変えられる、という発想力が足りてなかった...!
count するクエリを取り除くとかも、キャッシュに乗せる戦略を早期に試して、DBへのアクセスを以下に減らすかっていう視点で見れると、打てる手の経路が変わったと思う。
振り返り
久しぶりに学生時代の部活の大会みたいなテンションで楽しい時間でした。
同時に、自分の中でのこれまでの反省がおおかった。
これまでの興味として、開発者テストとかコード設計とかパタン・ランゲージに行ってみたり、アジャイルにいってみたりしていたので、ISUCONの分野について、あまり言語化していなかった。
業務でいくつか必要な場面でそういうことを考えることはあったが、それについて体系だった言語化には至っていなかった。それがゆえに、過去のいくつかの経験を再現性のある「脳力」に昇華できていなかったことを痛感した。
「やったことがある」とか「直感的にはそう思っていた」みたいなことを口に出したときに開発者としての再現性の発現を放棄しているところがあって嫌なんだけど、無意識にそうなっていた。
このことに自覚的になれたのが一番の ISUCON 参加の収穫だったかなと思う。 次回までに己の体を ISUCON に最適化する形で改造していきたい。
とりあえず「これがいいよ!」っておすすめいただいた本を読んで、「なんとなく」やっていたものを体系立てていきたい
いやはや、それにしても、ISUCON運営の方々が一番リアルなISUCONをされていたとおもうので、本当にお疲れさまでした。楽しい時間をありがとうございました!!!