ISUCONとは
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。
ISUCON公式ブログ
チーム
バナナマンさんというチームで去年と同じメンバーで参加。
去年の参加記録 ISUCON6参加記録とふりかえり
役割も大きく変わらず
- ぴろ:DB周り担当
- ちゃんまー:アプリ改修担当
- 自分:インフラ・ミドルウェア・プロファイリング担当、時間があったらアプリ
言語はGoも候補にあったけど慣れているRubyで。
今回のお題
チャットアプリケーション。だけど画像配信をいかに捌くかが肝のシステム。
結果
本戦出場にはまったく手が届かず・・・
初期スコア | icon静的化 | N+1解消 | 複数台化+インデックス付与 | ベスト | 最終スコア |
---|---|---|---|---|---|
4097 | 12438 | 15558 | 23297 | 29758 | 27279 |
今回は全体順位も公開されていて、それによると407チーム中143位。
http://isucon.net/archives/50961437.html
自分たちの位置がわかるのはとてもありがたいです。運営のみなさんの配慮に感謝
タイムライン
以下私の視点での記録。チームメンバーの視点は以下からどうぞ。
事前準備
去年のISUCON参加記事を読んだり、夏期講習を見たりといった感じ。
当日
9:30にオフィスに集合するも、開始が遅れたのでよいクラを3人で視聴しつつ、レギュレーションを読んだり役割分担を確認したりして過ごした。
- 13:13〜14:30
- 14:30〜15:30
- 自分は計測ツールを一通り入れ終わったので/iconsに取り掛かることに
- プロフィール画像をDBにバイナリで持っていて、毎回SQLで取得していたのでindexを貼る。これで1台構成でも4000台に。
ALTER TABLE image ADD INDEX idx_image_name(name);
- その後DB内のデータをファイルに書き出しで12438!ここまでは調子が良かった・・・
- 15:30〜17:00
- 初期データのみファイルに書き出していたので新規登録時もファイルに書き出す実装に取り掛かるもベンチが通らない・・・結局原因つかめず
- 新規は諦めて/iconsに来たときになければファイル作成に修正
- アプリ担当がN+1を修正
- 17:00〜18:00
- DB担当がmessageとhavereadにindexを付与(19904)
- 2台構成に戻す(23297)
- ここから何をすればいいかわからず迷走しはじめる
- 18:00〜20:00
- /fetchの
sleep 1
を外してみるも効果なし - /iconsのファイル書き出しを新規登録時に再チャレンジするもうまくいかず・・・すみませんすみません。
- 今回インデックスを貼って以降DBがボトルネックになっていなそうだったので放置していたDBの設定を見直すも効果なし
- ベンチガチャで29000台を出すもその後有効な手を打てず
- 上位チームは40万とか出ててどうなってんの?と言ってた気がする
- /fetchの
- 20:00〜終了まで
- アプリ担当がキャッシュで改善のためRedis導入を試みるも効果がでるところまではたどり着かずフィニッシュ
ふりかえり
Good
- 役割分担はいい感じだった
- オリジン弁当美味しかった
- 瞬間最高1位!!!
- 初動はだんだんスムーズになってきた
- NewRelic++
Bad
- 計測ツールを活かせていない
- 修正ポイントを見つけるまではいいが実装が遅い
- ローカル環境を全員分整備すればよかった
- キャッシュするための知識不足(HTTPのヘッダー:Cache-Controlとか)
- アプリケーションの分析が足りず自分のところばかり見てた
- nginxの設定の素振りが必要だった(去年も言ってた気がする)
まとめ
今年も本戦出場には遠く及ばなかったけど、年に1度エンジニアとしての腕試しに参加できて楽しかったです。運営のみなさん本当にお疲れ様でした!
できたこと、できなかったことをふりかえって(普段の仕事にも活かしつつ)去年の自分よりは成長しているようにがんばっていこうと思えた一日でした。