ISUCON10予選敗退した
ebiken.iconブログでちゃんと文章にした
レギュレーション
やったこと (時系列)
12:20~13:30
ebiken.icon143.icontockn.icon レギュレーション、スコア算出方法の確認
ebiken.iconリポジトリ、デプロイコマンド設定、バックアップ
143.iconNewRelic の導入
ebiken.iconローカル環境の構築
tockn.iconSQLから不要なカラムを削除
tockn.iconアプリのボトルネックをリストアップ
13:30~14:30
ebiken.iconNginx, MySQLの秘伝のタレいれる
tockn.icon/nazotteのN+1解決 (このあとRevertした)
ebiken.icon botからのリクエストに503返す
ebiken.icon index追加
143.iconインフラのsysconfまわりの秘伝のタレいれた
14:30~18:00
143.icon MySQLの設定周り修正
ebiken.icon POST /api/chairs, POST /api/estates を LOAD DATA INFILE使って高速化
リクエストのcsvをローカルのファイルシステムに書き出して読み込むようにした。
MySQLとappをサーバー2に配置し、該当のリクエストだけサーバー2に流すようにした
ENCLOSED BYつけてないとかファイルを配置する場所がおかしかったりとか、色々ハマったので二人に協力してもらって倒した
これが効いて 1200点でた。13位まであがってめちゃくちゃ盛り上がった
ebiken.icon 静的ファイルをNginxで配信するように
スコア変わらなかった
tockn.icon /nazotteのN+1解決
このあとRevertした
tockn.icon search系を軽くする
結局Revertしてしまった...
143.icon buy chair を軽くした
他の部分でベンチが動かず結局PRのまま入れなかった
18:00~19:30
143.icon MySQLの invalid connection とか aborted とかと戦う
tockn.icon search系のバグを直す
結局動かず...
ebiken.icon recommended を倒す
検索条件減らしたのと union でかなり軽くなったはず。NewRelicでもslow-queryから消えた
だが別のところでエラーが起きててベンチは通らず
19:30-21:00
143.icon NewRelic 外す、slow query log 止める
ebiken.icon Nginx の access log 止める
ebiken.icon /nazotteの動いてないやつを巻き取って、MySQLで計算してるところをappでやるようにした
バグらせて結局 Revertしてしまった
あとから読んだが、おそらく本当にちょっとしたミスだったのでかなり悔しい
tockn.icon search系のバグを直す
結局ベンチ通らず...
ebiken.icon1200点でたとこまで色々Revertしていった
結局0点で終わってしまった
一度1200点出て以降は、18:00くらいからずっとスコアが0点のまま最後までいってしまった。非常に悔しい。
スコアが0になったとき、DB側のCPU負荷がかなり大きくinvalid connectionとかabortedとか多発してたので、dbの負荷下げれば行けると判断してそのまま色々変更を入れてしまった。途中でバグを入れてしまったのかもしれない。
本番でベンチ回すときはブランチ切り替えてやるようにして、点数が出るブランチを保持しておくべきだった
最後revertが大変なことになってしまった
やれなかったこと
ebiken.icon今回は chairs/estates 両方に同時に書き込むエンドポイントはなさそうだったので DB分割できた。終了20分前に気づいたので、間に合わないだろうと諦めてしまった
ベンチがずっと通ってなかったのもある
降順インデックスの考慮
MySQL5.7で降順Indexが使えないのは知らなかった
ちゃんとexplain見てindex貼らないといけなかった
最後に
今回初出場だったが、大きなボトルネック潰せたり、スコアにはつながらなかったがボトルネック見つけて取りかかれた。健闘できたと思う
メンバーの2人にはめちゃめちゃ感謝。練習付き合ってくれたり当日も上手くコミュニケーション取りながら進められたと思う。何より楽しかった
来年は優勝するぞ!!