ISUCON予選2日目に初参加してきた #isucon
http://isucon.net/ ISUCONとは お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。 過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。
ということでISUCON予選2日目に会社の後輩2人とチームを組んで初参加しました。
事前準備と決め毎
- アーキテクチャ
- 担当
- DB・サーバサイドは私
- インフラ、フロントエンド周りは後輩達
- バージョン管理
- 本番反映フロー
- 面倒なので本番環境で直接
git pull origin master
する
- 面倒なので本番環境で直接
- コミュニケーション
- オフラインで集まるので基本は口頭
- 重要な事はChatworkで残す
当日開始前
開始してから12:00くらいまで
- サーバ構築
- リポジトリ構築
- スコア出し
- ひとまず本番環境からデフォルト状態で叩いて1300くらい
- ソースレビュー
- 16:00に一旦対応した物でスコアだそうと決めて作業開始
- ここまでは比較的順調
12:00から16:00くらいまで
- sloq_query設置
long_query_time=1
で設定したけど初期化のバルクインサートくらいしかのらない・・long_query_time=0
にしてmysqldumpslowコマンドで解析すべきだったと後に反省
- my.cnf設定
- 最大接続数周りを400にしたら200くらいスコアあがった
- innodb周りのメモリを潤沢に振ったがほぼ効果でず、むしろスコア下がった
- top見るとメモリよりCPUが喰っていたのであまり効果でない
- Nginx化
- 詳細な設定は後輩が対応したので把握してない
- これでスコアが2000くらいになった
- add index
ALTER TABLE login_log ADD INDEX (user_id, succeeded, ip);
- 後輩が複合INDEXを貼った
- これでスコアが4000くらいになった
- フロントエンド
- 後輩と2人でソース見た
- JSもCSSもほぼ使ってなかったのでチューニングする所なし
- 今回の課題はフロントエンド殺し・・
16:00時点でのスコア
- 4030くらい
- 他のチームがだいたい10000オーバーしていて何してるんだと疑問
16:00から17:30くらい
- my.cnf設定引き続き
- sort_buffer_sizeなどをチューニング
- 200くらい上がったが思ってた以上のスコアでない・・
- Nginxでのexpires、gzip対応
- ヘルプに入ったがNginx初めて触ったので結局対応出来ず・・
- アプリ
- 複数回呼び出している処理を整理
- この時点でベンチマークでworkload指定する事を知って発狂した
17:30時点でのスコア
- 4200くらい
- 万策尽きてきた
- 会社から他に2チーム出場してるので物理的妨害しようとしたけど失格になりたくないと諦め
18:00まで
- workloadを調整しながらベストなスコア算出
- 最終的には4300くらい
良かった事
※写真は実際の作業環境とは違うけどイメージ
反省点
- Nginxのチューニング
- 今回の課題はアプリチューニングよりいかに接続させないかが重要
- Nginxをもっと勉強していればもっとスコア伸びた
- 1つの事に固執過ぎた
- 役割分担を決めた事で変にそれに固執過ぎてしまった
- 早い段階で諦めて別の手段を考えるべきだった
- アーキテクチャの選定
- Redisなど、他のミドルウェアの知識が乏しく乗り換えができなかった
- ネットワーク
- SSHの設定
- SSHもよく切れたので事前にクライアント側で設定すべきだった
まとめ
もともと軽いノリで参加したので順位に拘りはなかったですが、ここまで差をつけられるとさすがに悔しいものがあります。ただ、エンジニアで集まってわいわいしながら開発するのはとても楽しかったですね。次回はもっとミドルウェアや判断力を身につけてリベンジしたいと思います。
運営、参加者の皆様、お疲れ様でした。