はじめに

 ISUCON7本戦にチーム「座るだけのコンテストってな〜んだ?」でmayoko君としょラーさんと参加してきました. 結果としてはスコア13895で全体13位でした.今年も非常に楽しいコンテストで,参加できて良かったです.運営,協賛企業の皆様,本当にありがとうございました.また一緒に参加してくれたチームメンバーにも感謝です.

isucon7 final scores

それでは,作業ログ・参加記を書きます.

本戦準備

 ISUCON6の本戦インスタンスをAzure上で立てて練習.お金がかかるので1台のみ使用,前日に5台使って練習した.今年もDocker&reactあたりは出るかなーと思っていたが実際はでなかった.けれど練習にはなったのでOKと思っている.

当日

10:20~ 本戦開始

・やったこと

 サーバセットアップ,DB, systemd,nginx,アプリの構成を確認.nginxやMySQLのログ設定を追加.

・考えたこと

 お題がゲームだったが,これは問題作成がKLabさんだったので予想通りだった.僕たちのチームはPythonを使用したが,ソースコードを確認したところ,aiohttpという知らないものを使っていたので驚く.またコードも型注釈などが入っているモダンなPythonの書き方で若干戸惑った.

11:00~13:00 プロファイルをとりたい

・やったこと

 ボトルネック特定のためプロファイルを取ろうとするが,aiohttpを利用して非同期実行されているため,kataribe,スロークエリログのログが使えないことに気づく,しょラーさんと自分でaiohttpのプロファイルをどうやってとるか試行錯誤開始. また,gunicornが利用されておらず1プロセスとなっていたのでnginxとaiohttpとの間に導入.そしてmayoko君がcalc_statusを改善できそうとのことなので頼む.

・考えたこと

 aiohttpでwebsocketを利用している場合にプロファイルを取るところでハマるのは完全に予想外だった.ググってみてもプロファイルの取り方が情報全然なくてつらかった.しょラーさんがいなかったら諦めて勘で改善していたと思う.というかそもそもなんでプロファイルが取れないのかに気づくことすらなかったかもしれない.

13:00~ 改善開始

・やったこと

 プロファイルがとれたのでアプリの改善に着手.

 DBのロックがボトルネックになっているっぽいことに気づく,どうすればロックを取らずに実行できるのかについて相談し,しょらーさんが改善に着手.

 一方でmayoko君がちょうど取り組んでいたcalc_statusが次のボトルネックっぽかったので自分はmayoko君の作業に合流し,ペアプロしながらmayoko君とペアプロしながらcalc_statusの高速化を実装. https://github.com/arosh/isucon7-final/pull/2/files

・考えたこと

 DBのロック,結構時間を掛けて解決方法を相談したり試してみたりしたが,終わった後の解説・講評では全く触れられておらず,どうやら他の部分を改善していったら気にならなくなっていくものだった様子.本番中にも,そこはそういうものと諦めてロックをとった後の処理を改善する方にもう少し時間を割いていれば良かった気もする.他にも,DBを分散させてロック時間を減らす手法もチラッと考えたが,深いとこまで詰めておらずさらっと流してしまった.

15:00~ 実装を頑張る

・やったこと

 get_status, add_isu, buy_itemあたりの改善にとりかかる.calc_statusで毎回過去のデータ一覧を取得して計算しているところがアホでしょ,となり,データを保存しておき更新するように実装開始.

しかし,実装ができ見た目動いているように見えたもののベンチに通らずこの実装は反映できず. 作業ブランチ

・考えたこと

 アプリの中身が結構複雑で,実装をしながらしょうもないバグ(不等号の向きとか±1ずれるとか)で時間を溶かしていた.こういうところでサラッと実装できるような実装力は今後の課題.もしこの改善をデプロイできたら結構な改善になったはずだが,やりきれなくて悔しかった.    

18:00~ フィニッシュ

ログの設定などを除去しベンチを回したところ13kぐらいのスコアが出てフィニッシュ.

感想

 チームとしては,方針とか施策とかについて相談しながら進められたり,自分とmayoko君で実装をしている裏でしょラーさんがN+1とか複数台構成とかパラメータチューニングとか色々試してくれたりと効率良く動けていたと思う.色々あーすれば良かったなーとか,なんでこうしてしまったのだろうとかあるが,本番8時間の中では精一杯実力を発揮したと思う.

 個人としては,アプリの実装に時間がかかったのを感じていて,あらためてもっと素早く適切な実装(プログラミング)ができるようになりたいと感じた.

 今年の本戦も題材が非常に面白く,取り組んでいて楽しいコンテストだった.あらためて運営の方々には感謝です.

 懇親会にて他のチームと感想を話したりして,方針や考えたことに共通点があり,なにもできなかった去年の本戦からは成長を感じた. 学生枠で出場できるのは来年が最後なので,来年こそは100万円目指して頑張りたい.

さいごに

 就活を始めています.自分の技術を磨きつつ,貢献できるようなところで働きたいです. また,就活では情報系の大学院生としてWeb系に限らず幅広く色々なところを見ようと思っています. もしこのブログを見て興味を持ってくださる方が居たらメールやTwitterから連絡/質問をお願いします. お気軽に連絡送ってください.お待ちしております.