ISUCONとは
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。
ISUCON公式ブログ
チーム
バナナマンリターンズというチームで去年と同じメンバーで参加。全員普段はアプリエンジニア
去年の参加記録 ISUCON5に初参加してきた
事前に役割分担をざっくり決めておいた
- ぴろ:DB周り担当
- ちゃんまー:アプリ改修担当
- @asflash8(自分):インフラ・ミドルウェア・プロファイリング担当
言語は全員書けるRubyで臨んだ
モチベーション
- 去年悔しい思いをしたので今年こそは爪あとを残したい
- 1年でどれだけ成長したのか腕試し
- ギョウムにはない刺激を求めて
結果を先に
初期スコア | ベスト | 最終 |
---|---|---|
0 | 15639 | 14442 |
去年よりは向上したものの予算通過ラインの90000には遠く及ばず悔しい結果に
タイムライン
以下私の視点での記録。アプリ周りのことはチームメンバーが書いてくれたのでこちらが詳しい
事前準備
- 社内インフラエンジニアによるAzure勉強会
- 計測用ツール(Kataribe、pt-query-digest)のインストールスクリプトの準備
- my.cnfとnginx.confの準備(後にこれで盛大にハマる)
- 去年アプリの反映ミスで悔しい思いをしたのでデプロイ&プロセス再起動の自動スクリプト準備
- ISUCON予選突破を支えたオペレーション技術を大いに参考にさせていただきました
当日朝
無事会社に出社。9:30には全員集まる。朝時間通りに集まれてエラい
10:00~10:30
インスタンス起動とBitbucketのリポジトリへのpushやssh設定など
初期ベンチ実行 perlで2610(去年の最終スコアよりいいじゃん!)、rubyで無事0を記録
10:30~12:00
- 計測ツールのインストールで手間取る
- percona-toolkitのインストール→成功
- kataribeのダウンロード→成功
- kataribeのunzip→unzipが無くて失敗
- unzipのインストール→何故か失敗
- go getでインストールに切替→成功
- bundle installでrack-lineprof→失敗
-
.bundle/config
のBUNDLE_FROZEN: 1
が原因でした
-
結局アプリのプロファイラなしで挑むことになり、これが最大の敗因だったと思う
12:00~13:00
- htmlifyの処理内でkeywordを取得してN+1になっている部分を修正
- 5000点超え
- 瞬間的に5位に!
- keywordの
select *
をselect keyword
に変更 - updated_atにindex付与
- ↑2つはあまり効果がでず
- この間私はnginxで静的ファイルを返す&キャッシュを試みるもnginx.confの設定にハマる無能
- 結局2時間溶かした
デプロイとプロセス再起動の自動化スクリプトが役に立った
13:00~15:00
- お昼食べつつ試行錯誤するも点数変わらず
- ようやくnginxで静的ファイルのレスポンスとキャッシュ設定が通るように
- むしろ点数が下がる(Kataribeのレスポンスでは早くなっているのに)
- /へのアクセスが増えたことで全体が詰まって点数が下がったと思っている
15:30~16:30
- keywordsのソートをSQLからRubyに→変わらず
-
htmlify
が遅いことはわかっていて、インフラ・ミドルウェアでできることがあまりなくなったので自分もアプリを見始める -
htmlify
をキャッシュする実装を反映- 6000→15000に大幅UP。この日最高のテンション
16:30~18:00
- keywordの変換結果をキャッシュ→変わらず
- select * の撲滅→変わらず
- isudaのワーカー数を5→8に→変わらず
- MySQLのスロークエリを外す→変わらず
という感じでhtmlifyのキャッシュ以降目立った効果が上げられずFinish
まとめ
- デプロイ&プロセス再起動の自動化はやっておいてよかった
- やったことないことは本番でもできない。予習はやっておこう
- 瞬間最高5位はとてもうれしい。最後までここに残れるようにがんばろう