ISUCON11に「良心の呵責」というチームで参加して予選敗退しました

ISUCON11に「良心の呵責」というチームで @44smkn@kuwata0037 と参加しました。

isucon.net

結果としては予選敗退で最終スコアは34,976点(122位)でした。決勝進出は10~15万点あたりがボーダーのようだったのでまだまだでした。
結果は残念でしたが非常に楽しく学びのある1日でした。

コミュニケーションツールとか

チャットツールにはSlack、通話ツールにはDiscordを使っていました。当初は通話ツールとしてGoogle Meetを考えていましたが、6/30に無料期間が終わってしまい1時間制限がかかるようになってしまい変更しました。

SlackはGitHub連携を行ってIssueやPRのopen時や、@44smkn の謹製ツールでdeploy時に通知が届くようにしていました。

分析ツールとか

当日までは予選問題の確認や解説を読み込んでいました。また、前回参加者の振り返りブログを読んで何をやっていたのか当日のイメージつけたり、便利なツールを知ることから始めました。
(当たり前ですが)スロークエリやアクセス傾向をしっかり確認できるようにすることがチューニングの第1歩だなぁ、という感想です。
ツールとしては、 pt-query-digest や alp などを実際に使って過去問で試していました。

www.percona.com

github.com

ですが、ISUCONに対してNewRelicが支援を行っていて無料で使えるということもあり、全てNewRelicで当日は挑みました。

newrelic.com

当日やったこと

(誰も仕事としてバリバリ使ったことはないもののある程度読み書きができる)Goで解きました。
まず1時間くらいはマニュアルを読んだり実際に画面を見たりして内容の理解に努めました。その後はベンチマークをまずは回しつつ、NewRelicを仕込んで計測できる体制を作っていました。たしか初回ベンチスコアは2,500点くらいだった気がします。
その後はひたすら時間を多く使っているAPIやレスポンスが遅いAPIの実装の改修を行っていました。12時過ぎ頃には、POST /api/condition/:jia_isu_uuid はN件のデータをN回insertしていたのでbulkでinsertするように改修をしました。他に @kuwata0037 がindexを追加してくれたり、 @44smkn がDBのサーバ分離をしてくれたおかげでスコアが順調に伸びました。たしかお昼過ぎで2~3万は超えていたような気がします。この後は GET /api/isuGET /api/trend のN+1に取り組んでいましたが、時間切れになってしまいました。

当日できなかったこと

予選終了後にDiscordで多くの方が対応内容を共有されていて非常の参考になりました。自分たちは過去問からN+1などばかりに目が行っていましたが、Ngnixの設定やDBのコネクションなど足元の設定でかなりスコアが改善されるそうでした。また、僕が取り組んでいた GET /api/trend のN+1もクエリに limit 1 を足すだけでとりあえずは良かったみたいでした。これは完璧を狙いすぎて全クエリを1つにしようした結果、シンプルな解法が見えていませんでした。

個人的に悔いが残る部分としてはミドルウェアの理解とクエリ力でした。普段の業務だとミドルウェア周りの設定ファイルはある程度できあがっており修正頻度も高くないため知らないことが多かったです。クエリ力も足りず引き際が見極めきれなかったのも時間を浪費する理由だったと思います。

他にも得点を上げるための施策がありそうですが他のブログを見て勉強しようと思います。

参加した感想

全体を通してISUCONは非常に楽しい大会でした。毎年出場する人がいるのもうなずけますし、やはり「あれをやっておけば...」と後悔するからこそ学習に精が出るし身につくのだな、と思いました。
特にチームメンバーには助けられ @44smkn にはインフラ周りを任せきりになり、 @kuwata0037 は気がつけばindexを貼ってスコアを伸ばす職人芸を見ました。通話でわいわい話しながら準備して当日も楽しめたので良かったです。

運営、NewRelicの方々もありがとうございました。