ISUCON8 予選に参加してきました
はじめに
9/16に開催されたISUCON8予選の2日目に @Konboi & @tkuchiki と毎年恒例のチーム「流れ弾」として参加してきました。 結果は19位とあと一歩のところで予選敗退となりました。
チームメンバーのブログ
準備
前週に3人で集まってISUCON7の予選問題を復習
復習といいつつ、昨年の記憶が飛びすぎていて初めて挑戦したかのような気持ちで進めていました(手を動かしているうちに少しずつ記憶を取り戻しました)
毎年の習慣でbitbucketでソースコード管理をしていたのですが、「慣れてるGithubにしたい」とKonboiが話していて、そういえば自分がGithubのDeveloper Planを契約しているのを思い出してGithubに移行
ローカル環境を作ろうとしたもののうまく動かせず、本番での動作確認が必要になり余計なミスを生む結果に
練習の後は各自で個別で復習したりツールを使ってみたりを実施
sqldef 便利
当日
自分とKonboiがアプリメイン、tkuchikiがインフラメインのいつもの役割分担で進めました。 全体の流れはKonboiがまとめてくれているので自分がやってたことを書きます。
レギュレーションを読んで、Konboiとアプリを動かしながらコードを読む
初期ベンチを回してalpで集計
/api/user/:idページが重かったのでそこの修正から始めることに
練習でローカル環境の必要性を感じていたので、Konboiが事前に用意してくれていたdocker-composeを元にローカル環境構築を進める
本番がMariaDB5.5になっているのを確認し忘れていて、dockerはMySQL5.7で動かそうとしていたためGROUP BYでエラーが発生
sql_modeのONLY_FULL_GROUP_BYを無効化して動かすようにしました
本番サーバの方もMySQL5.7を使うようにtkuchikiに変更を依頼
/api/user/:idをローカルで修正
ループの中でgetEventという重い処理を呼んでいたので、事前にJOINしてevent情報を取得するように修正
view側でpriceの値を見てなかったのでとりあえず0を返すように(ミス1)
ORDER BY IFNULL(r.canceled_at, r.reserved_at) DESC
を初めて見てORDER BY r.canceled_at DESC, r.reserved_at DESC
に変更(ミス2)
手元のコードをデプロイできるようにtkuchikiに準備してもらう
修正コードをデプロイしたらfail
横着せずにAPIのレスポンスが正しく返るように修正
IFNULLは単純に分けることができないと気づき元に戻す
/api/userのrecent reservations部分を修正し、1700点に
Konboiが対応してくれたトップページの実装を参考に/api/userのrecent events部分を修正
こちらもgetEventを呼ばずにJOINしてevent情報を取得するように修正
3800点に
Konboiが/api/eventの修正を進めてくれている間にtkuchikiとgetEventのクエリ改善に着手
tkuchikiのローカル環境が間に合ってなかったので、2人でペアプロしながらローカルで修正を進める
試行錯誤していたものの、その後、Konboiが進めてくれていた修正内容を取り込めば改善できそうなことが判明しここの修正はなしに
その後、tkuchikiに複数台構成化を進めてもらいつつ、自分はKonboiとアプリ改善の続き
点数は上がっているもののfailすることが多くなって時間が過ぎていく
結局原因をつかめず、最後はお祈りベンチを実行して終了
ローカル環境をすばやく作れたのはよかったけど、アプリケーション改善はKonboiに頼りっぱなしで自分は地味な改善くらいしかできていなかったのが反省点。
goを使うのがisuconの時のみになってしまっているのと、RailsのActiveRecordに頼りすぎていてSQLを直接書く機会がほとんどなくなってしまっているのはマズイなと改めて思いました。
来年は二人の足手まといにならないように引き続き精進します。
さいごに
運営の皆様、今年も素敵なイベントをありがとうございました! そして、チームメンバーの二人もいつもありがとう!