isucon5予選問題で1万点超えを目指した話
About
以前短い時間でisucon5の予選問題に挑戦したのですが、消化不良だったため時間制限を取っ払って挑戦してみることにしました。タイトル通りスコア1万点を目指します。
前提
- 無料枠で実施しているため、マシンタイプはn1-highcpu-2(vCPU x 2、メモリ 1.8 GB)とする
- その他については予選と同等にする(HDD 10GB)
- ベンチマークはインスタンス内で実施する
- スコアは再起動とか考慮せずに、とにかく最高得点ベースで考える
- 復習も兼ねてやりたいので、一からしっかりやる
- 今回はrubyで
- mysqlの設定ファイルの罠は事前に知っている
- わからなかったら、ググる。パクる。次できればいいんや!
ボトルネックを探る
rack-lineprofでアプリ解析 kainosnoema/rack-lineprof · GitHub
kataribeでnginxのアクセスログを解析 matsuu/kataribe · GitHub
基本的にkataribeでざっくり確認してどこのリクエストが重いか特定。その上でrack-lineprofやslow queryで重そうなところを潰していくような形でやりました。丁寧に1つずつやっていけばある程度のスコアは出そうな感じがしました。sqlについてはdumpを取ってローカルで確認するようにしました。MySQLWorkbench使うとGUIでexplainの情報を確認できるので、個人的には便利でした。また、rubyやsinatraに自信がなかったのでそこについては平行して勉強しながらやりました。パRubyの後半の章にsinatraの話が載っていたのでそこで基本的な使い方を覚えた形です。
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (22件) を見る
スコアまとめ
実際に何をやったかについては、恥を忍んでPRを晒しておきます。雑にやってるので、細かい部分は見逃して下さい(´;ω;`)
スコア | 主にやったこと |
---|---|
100.1 | 初期スコア |
260.6 | nginxの設定 |
388.6 | unicornのworkerを1->2 |
410.2 | innodbのbuffe_pool_sizeを1Gに |
450.7 | 無駄なORの削除 |
510.4 | 友達リストを作る |
590.7 | あなたの友だちのコメントのSQLを改善 |
948.3 | friends_queryを改善 |
1139 | 不要そうなMAX句を削除 |
6788.7 | footprintsにindexを貼った!! |
6934.5 | sqlを改善 |
7021.3 | get_userをメモリに入れるように |
8017.8 | index.erbでget_userを使わないように |
8167.8 | 必要なカラムだけ取得するように |
8242.2 | |
- | 気合をいれる |
8307.6 | saltsとusersをマージ |
8650.4 | デバッグ用の設定を外す |
8882.5 | もろもろ調整 |
9179.3 | query_cache_typeをオンに |
10132.8 | きたああああああああ |
まとめ
この記事はタイトルを事前に書いて、そこからいろいろ試してみました。ブログ駆動開発よいですね。また、実際にやってみて本番で予選突破した方々すごすぎる…3人だとしても、あんな短時間でこれ以上のスコアを出さないといけないなんて((((;゚Д゚))))ガクガクブルブル
この取組を通して普段やらないアプリ側を弄ったり、mysql触ったりいろいろ出来て楽しかったです!!!スコアなかなか上がらない時は心折れそうになりましたが、いろいろ学べたので今回の取り組みを業務に生かしたいと思います!!!
来年ISUCON6があったら出場するぞ!!!
まだ反省すべきところは多いので、明日から振り返りをやりたいと思います(^^)今日はいいよね…
よくわからなかったこと
インスタンス内からベンチを動かしている時にこんなエラーが
RESULT: fail SCORE: 16.8 友だちリストに友だちになったばかりのユーザが表示されていません
何度か出会したのですが、体感としてはAM0時〜9時までは上記のエラーが出たような気がします。夜に働くものじゃないということだったんでしょうか。(タイムゾーンの問題?)