ISUCON7予選に参加しました
ISUCON7予選に参加しました。
その前にきちんと投票しました。
チャリで行ったので雨が目に染みてつらかった。
最終スコアは40088点で学生枠で本選に出場することができました。
の強い編入生2人と一緒に参加した。
アプリケーション改修担当として参加した。
バグ取りが終わらなかったためスコアに反映させることができなかった...悔しい。
一緒に参加した2人が優秀で良かった...
やったこと
セットアップ
show create table hoge;
をslackで共有SELECT * FROM hoge LIMIT 10;
をslackで共有- myprofilerを入れる
myprofiler -user=root
でmysqlに繋げなかったので困った。
- kataribeを入れる
- rack-lineprofを入れる
ほぼコピペのセットアップを終わった時点で1時間くらい経っていた。
アプリケーション改修
まずmyprofilerでスロークエリを探してみたものの、何も表示されなかったのでそんなもんなのかーと思いrack-lineprofで遅い行を探す。
- GET /fetch が遅かったが、レギュレーションでスコア計算に入らないと書いてあったため無視。
- その次にGET /messageが重そうだった&N+1があったのでこの辺を改修することに決めた。
練習での経験*1よりmessageを全部redisに載せてみる作戦をとってみることに
(これが完全に判断ミスだった)- mysqlからredisにデータを流し込むスクリプトを書いた
- GET /messageを書き換えた
- POST /messageを書き換えた
- 他でmessageテーブルを参照しているところを探したら色んなところで使っていた
- 書き換える, また見つける, 書き換えるを永遠に行った
- 一通り書き換えが完了したのでwebサーバ起動させて動作を確認する
- バグが大量に生成したいたので地道に潰していく...で時間切れとなった。
- messageをredisに移植したかった by euglena1215 · Pull Request #2 · k5342/isucon7-qualification · GitHub
他のメンバーはアプリケーションをごにょごにょしている間にiconを304で返せるようにほげほげしてくれていた。
詳しくはこちら
反省点
- 影響範囲を考えて手をつけていなかった
- 変更しながら後悔する羽目になった
- channelごとのmessage数のカウンタをredisで実装とかは影響範囲が小さくある程度の効果が見込めたはず
- N+1をきちんと潰してなかった
- こちらの方が優先度は高いはず
- そもそもredisに慣れていなくて時間がかかった
- 鍛錬します
①N+1を潰す
②影響範囲の小さいところからredisに載せていく
の2つを確実にこなせるように本選まで練習したいと思う。
*1:pixiv isucon, ishocon1, isucon4でオンメモリ化させる判断がつかず点数が上がらなかった