isucon9の予選に出て敗退した

isucon9の予選に参加して、今年も予選敗退してしまったのでその記録を残しておく。今年で4回目で、id:hitode909 さん、id:side_tanaさんと「ミッシングマグネティックストレージ」という名前のチームで出た。最高スコアは6720イスコインで、最終スコアは5120イスコインだった

振り返ってみたけど自分はほとんど何もやってない。もう少し手を動かす必要があった。

準備

締め切り1週間くらい前にチームを組んで、予選1週間くらい前に練習をした。レギュレーションを読んだり、言語どうしましょうねとか、あと最初にこういうことやりましょうとかそういうことを話して、isucon8の予選問題で軽く試したりした。ここ数年はAzureとかConoHaとか使われているものの、だいたい「サーバにSSHでログインしてあとはいい感じにする」みたいなムーブになってしまい、出題環境となるクラウドサービスを特に触らずに終わってしまう。今年はなにか触ってみたいなと思って、どうせNginxのログとか集めたくなるのでLogServiceというのを使ってみることにした。それ以外は「デプロイはrsyncでやりましょう」「sshの鍵を事前に集めておきましょう」という話をして、Alibabaのテスト用インスタンス無事立てられましたね〜とかをやった。

前日は明日最初にだれが何をやるのかというのを決めたり、RAMユーザーをチームメンバー分発行したり、あとはテンション上がりそうなご飯はどこで注文しましょうかとか話して解散した。前日は飲酒禁止ですとか言っていたのに、その後うっかりビールを飲んでしまった。

LogService

なんとなくLogServiceのドキュメント眺めてたら便利そうだったので使った。この辺りにNginxのログを集めて分析する方法が書いてあったので導入時に困ることもなかった。

jp.alibabacloud.com

「よく使う集計クエリ」を保存しておけるのがよかった。ベンチマーク走らせたあとに各自がそれぞれの画面でログの集計結果を眺めたり、好きなクエリで集計できそうだなと思ったので導入した。もちろん、こういうのはkibanaとか使ってもいいのだと思う。とにかく今年はいつもと違うことをやってみたかった。 f:id:tkzwtks:20190909225629p:plain

当日

当日どういうことをしたかはhitode909さんのブログにある通り。

blog.sushi.money

今年はアプリケーションの改善に集中したい、ということを練習時から話していて、実際みんなでそういう動きをできたのは良かった。hitode909さんの細かい修正は少しづつスコアを上昇させたし、side_tanaさんが導入したCloud Traceはアプリケーションのボトルネックを探すにはかなり役に立った。

tana.hatenablog.com

最初にも書いたけど、僕はあまり手を動かすことができずに、最初やる予定だったタスクをやったあとは、このサービスはどういうアプリケーションか、みたいなことをずっと考えたり、ペアプロに参加したりしていた。/buy のエンドポイントが遅いものの、ここを改善しないとポイントが上がらないと考えていたので、どう改善するかということを考えていたけど、結局解決案を見つけられなかった。サービスで実際にユーザーがどういう動きをするのだろうかというモデルをうまく作れたらもう少し改善できたのかもしれない。普段から触れているアプリケーションなら「この画面のあとはここに遷移するはずだから、この処理はあとでもいい」みたいな解決案は出せるかもしれない。しかしisuconみたいに初めて触れるアプリケーションでそういうことをやるのは難しい、というのは改めて実感した。こういうのが得意な人もいるのかもしれない。次回は(ベンチマーカーが模している)ユーザーがどういう動きをしているか、というのを最初に考えるといいかもしれない。

/buyにこだわりすぎたのもよくなかった。「/loginが遅い」という話はしていたものの、今回のスコア計算は「売ったイスの総額」になるということだったので、とにかく購入エンドポイントを解決するのが先決だと思っていた。が、/loginを素早く捌けるようになればより多くのユーザーが購入までたどり着けるようになるはずで、もしかしたらスコアを上げることができたかもしれない。ここを改善するための案はそこそこ早く話し合えたものの、タイムアップまでの時間があまりなくて試すこともできなかった。

アプリケーションの改善にこだわりすぎて、結局サーバーを1台しか使えなかったのも反省点だと思う。まずはアプリケーションのボトルネックをある程度解消しないとホストは増やせないと思っていたが、最終的には増やしたいはずだったので、最初から3台でやればよかったのかもしれない。同様にキャンペーンレベルを最初からMAXでやればよかったと思う(キャンペーンレベルは一度MAXにしてみたが、その結果スコアががくんと下がったのでその後日和ってしまったのだった)。あと最初に書いたけど、やっぱりもう少し手を動かす必要があった...

反省点はあるものの、今年は「どういうアプリケーションか考えながら改善したい」というつもりだったので、一貫してそういう話ができたのは満足感がある。問題のボリュームは多いなと思ったけど、考えることもたくさんあって楽しかった。あとisuconは普段の仕事と違う人とチームを組めるのがよい。普段一緒に仕事していないメンバーと課題に取り組むのは新鮮な感じがして楽しかった。出題者、運営の皆様お疲れさまでした。来年こそは本戦に出たいと思いつつ、しばらくは反省の日々を過ごします...