tjinjin's blog

さらなる高みに1nmずつ近づくブログ

isucon5予選問題で1万点超えを目指した話

About

以前短い時間でisucon5の予選問題に挑戦したのですが、消化不良だったため時間制限を取っ払って挑戦してみることにしました。タイトル通りスコア1万点を目指します。

前提

  • 無料枠で実施しているため、マシンタイプはn1-highcpu-2(vCPU x 2、メモリ 1.8 GB)とする
  • その他については予選と同等にする(HDD 10GB)
  • ベンチマークインスタンス内で実施する
  • スコアは再起動とか考慮せずに、とにかく最高得点ベースで考える
  • 復習も兼ねてやりたいので、一からしっかりやる
  • 今回はruby
  • mysqlの設定ファイルの罠は事前に知っている
  • わからなかったら、ググる。パクる。次できればいいんや!

ボトルネックを探る

基本的にkataribeでざっくり確認してどこのリクエストが重いか特定。その上でrack-lineprofやslow queryで重そうなところを潰していくような形でやりました。丁寧に1つずつやっていけばある程度のスコアは出そうな感じがしました。sqlについてはdumpを取ってローカルで確認するようにしました。MySQLWorkbench使うとGUIでexplainの情報を確認できるので、個人的には便利でした。また、rubysinatraに自信がなかったのでそこについては平行して勉強しながらやりました。パRubyの後半の章にsinatraの話が載っていたのでそこで基本的な使い方を覚えた形です。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

スコアまとめ

実際に何をやったかについては、恥を忍んでPRを晒しておきます。雑にやってるので、細かい部分は見逃して下さい(´;ω;`)

github.com

スコア 主にやったこと
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時までは上記のエラーが出たような気がします。夜に働くものじゃないということだったんでしょうか。(タイムゾーンの問題?)