ISUCONとは
http://isucon.net/
WEBサービスのチューニングのうまさを点数化して全国で競い合うコンテスト
今回の問題
今回はチャットシステムでした
- ユーザー登録・編集
- チャットグループの作成
- チャット閲覧・投稿
運営から3台サーバを渡されて自由に使って良いという感じ
一応2台アプリケーションサーバ、1台DBサーバという感じ
チーム
チーム名: バナナマンさん
言語: Ruby
去年・一昨年と同じチームで挑みました(去年の記事)
毎年付き合ってくれる2人に感謝
- ミドルウェア・インフラ周り担当
- アプリケーション担当
- DB担当
みたいなざっくりした分担で臨みました
僕はDB担当
やったこと
- 土曜9時半に集合したものの運営のトラブルにより開始が13時にズレる
- 午前中とても暇だったがゆっくりレギュレーション読み直したりチームメンバーと方針・分担の最終確認ができたりとそこそこ有意義だった
- 待ち時間中のDiscordのチャットのやりとりが面白かった
- 13:13開始
- 開始1時間は当日マニュアルの熟読、アプリケーション構造の把握、WEBアクセスしアプリの仕様把握、ソースをgit管理、DBをSequelProで接続しtableの把握、などの下準備
- とりあえず初期状態でベンチ走らせたら素の状態で7000点出て瞬間最高1位を記録!w
- その後rubyに切り替えて実行したところ初期スコア4000点
- ようやく出揃ったところでミドルウェア担当がボトルネック調査用のツール群を入れ始める
- その間にアプリケーションソースを読む
- iconがくっそ重い、N+1クエリが結構な数ある、インデックス貼られてないところがある…というのがパッと分かったこと
- 2時間経過くらいで作戦会議、iconをnginxで静的ファイルとして返す・N+1クエリ直す・インデックス貼る、という方針でいくことに
- アプリケーション担当がN+1クエリを直すのに苦戦していたので手を貸すことに(何回ベンチ走らせてもベンチツールがエラーを吐く…)
- デバッグしないと埒が明かなかったので手元にsinatraの環境を構築、sinatraを普段使いしてないので手間取った…
- ruby配下のソースだけ持ってきてもだめで、その上に配置されていたpublicを持ってこなきゃいけなかったのでscp
- 手元で動くようにしてようやくデバッグ開始→MySQLのエラーだったりrubyのエラーだったりとまちまちだった
- その間にiconの静的ファイル化が完了しベンチ→12000点にアップ
-
/fetch
アクションのN+1クエリを解消→15000点にアップ - アプリケーションが落ち着いたのでようやくDBに戻る、channel_idやmessage_idなど主要なところにインデックスを貼る→23000点
-
/fetch
のsleep
を外してみる→効果なし - このあたりで徐々に点数が停滞しはじめる…(18時頃)
- その後他のN+1クエリを直すも効果なし
- 土壇場になってRedis導入しキャッシュ化しようとしたがうまくいかず
- 結局最後はベンチマークツールのブレ幅を見て複数回ベンチガチャを回して29000点をマークしたところで終了
結果
初期スコア | icon静的化 | N+1解消 | インデックス付与 | 最終スコア |
---|---|---|---|---|
4097 | 12438 | 15558 | 23297 | 29758 |
感想と反省
- 瞬間最高1位を記録できたのがよかった
- 開始遅れによりモチベのチューニングに失敗し、18時過ぎたあたりから集中力がガクッと落ちた(言い訳とも言う)
-
Sinatra
の素振りが足りなかった - インデックス付与後のアクションが鈍かった
- キャッシュ化に着手するのが遅かったし
Redis
の素振りも足りなかった - ベンチマークツールのブレ幅が結構あり、修正が効いてるのかどうか判断に迷うことが多かった
- 前回はgit管理→プルリク→マージのフローを採用してスピードに欠けていたので今回はgit管理→セルフマージで行うことでスピードは出た
- ただしスピードが出た分failになる頻度が高く、結果としてやりたい改修になかなか着手できなかった
- サーバ上でvimで直接編集してもデグレしない力が欲しいと感じた
- 一言にキャッシュ化と片付けていたが基本的な知識が足りない気がする…
- 開始1時間での目のつけどころは予選突破チームとほぼ一緒なので、着眼点は良かったが改修する力が足りなかった
おわりに
今回も問題・ベンチツールの仕様が全然違うので直接点の比較はできないですが、前回15000点だったのが29000点に上がったので着実に上ってるという感じでした
今年は参加するかどうか悩んだが、やはり参加すると楽しい
来年出るかどうかは微妙なところですが、機会があれば是非出たいと思います!