はじめに

 ISUCONの予選にmayoko君としょラーさんとチーム「座るだけのコンテストってな〜んだ?」として参加した.結果としては,スコア44,812で学生枠として通過した. 参加記として作業ログとかを書く.

mayoko君の参加記: http://mayokoex.hatenablog.com/entry/2017/10/22/220000

しょラーさんの参加記: http://kujira16.hateblo.jp/entry/2017/10/24/023418

去年の参加記(予選): http://brookbach.hatenablog.com/entry/2016/09/20/010448

去年の参加記(本戦): http://brookbach.hatenablog.com/entry/2016/10/31/224241

チーム

 mayokoくんとしょラーさんとチームを組んだ.mayoko君は去年と同じで,突然声を掛けたら今年も参加を了承してくれたので圧倒的感謝. その後,mayoko君とともにTwitterで募集をかけ結成.しょラーさんもmayoko君もフォロワー数多くて拡散力ありすごいなと思った.ちなみにしょラーさんとは今回はじめて知り合った.

準備

 とりあえず競プロslackでプライベートチャンネルを作り,AWSの無料枠を利用してpixiv-isuconで練習.

 事前に公開された予選レギュレーションが予選から複数台構成であることを匂わせていたのでサーバーを3台準備した.結果的に本番とほぼ同じ構成で練習できた.

 最初のセットアップがめんどくさいなーと去年から思っており,今年はansibleで構成ファイルを作成し,これを流し込むだけで準備が完了するようにした.

作ったやつ→https://github.com/keigo-brook/isucon-startdash-ansible

本番

 mixiさんの会場を借りて参加する予定だったが,台風の影響もあり自宅参加にする.

13:00〜

 レギュレーション,構成の確認.セットアップを3台に流し込む.

13:30〜

 作業開始,サーバーが複数台あるが,とりあえず単体で動かして様子をみていくことに.

nginxをしょラーさんに見てもらう.

mayokoくんにapp.pyを見てもらう.

mysqlのスロークエリログ設定を埋め込む.

14:00〜

 ファイルとか修正した後のサーバーのreloadがめんどくさかったので,同時に3台リロードできる環境をシェルとtmux使って作る.

14:30〜

 ベンチを回し,nginxとmysqlのログを確認. /iconsを静的ファイルとしてnginxに返してもらう実装をしょらーさんに任せる. 自分はコードを読みながら仕様確認.

15:00〜

mysqlのスロークエリを確認したら以下のログが出ていた.

Count: 707  Time=1.22s (861s)  Lock=0.00s (0s)  Rows=16.2 (11431), isucon[isucon]@2hosts
  SELECT * FROM image WHERE name = 'S'

Count: 26001  Time=0.01s (142s)  Lock=0.00s (1s)  Rows=1.0 (26000), isucon[isucon]@2hosts
  SELECT COUNT(*) as cnt FROM message WHERE channel_id = N

Count: 26243  Time=0.00s (6s)  Lock=0.00s (1s)  Rows=0.0 (260), isucon[isucon]@2hosts
  SELECT * FROM haveread WHERE user_id = N AND channel_id = N

 imageのやつはしょラーさんにお願いしてあるので,二つ目以降の処理を更新にかかる.メッセージ総数を都度計算しているのでDBに保存するように修正.

16:30〜

 自分の実装としょラーさんの実装を本番サーバーに反映し,ベンチを走らせる.スコア3万ぐらい.

 いまだに/iconsが重いことに気づき,原因調査する.帯域がボトルネックなことに(しょラーさんが)気づく

17:30〜

 画像をjsでごにょごにょすることで/iconsへのアクセスを減らす案を思いつき実装してみる.終わった後気づいたが静的ファイルなので編集しちゃだめなやつだった.

18:30〜

上の実装ついでにN+1を削除

19:00〜

 /iconsについて試行錯誤,色々消したり追加したりしてみるもスコア4万前後で伸び悩む

20:00〜

 再起動テストとかをしつつベンチマークガチャを回し始める.最高点は5万ぐらいだったが最終的には4万ちょいぐらいの点数でフィニッシュ

感想

  • 予選突破できて良かった
    • 一般枠と比較すると全然点数とれてないけれども
      • 学生枠は運営が用意した10ステップのうち2~3ステップぐらいクリアすれば通る印象
      • 一般枠は8~9ぐらいクリアしないとだめな感じ
  • ansibleの構成ファイル用意しておいて良かった
    • DBのバックアップがすでにあったり,無駄になったところもあったが軽く修正するだけでセットアップが終わったので楽だった
    • sshについても鍵を流し込む設定を作っていたので,fail2banとかで引っかかることもなかった
  • /iconsについて,うまく対処できていればもっとスコア伸びただろうなーと悔やまれる.
    • 今年はそこを突破できるかどうかが結構ポイントだった
    • 去年の本戦でも感じたことだが,詳しい人なら常識でさっと対処できるような問題にハマるなーと
  • 去年は自分が全体見つつ仕事を振る感じだったが,今年はしょラーさんに半分ぐらいお願いしていたので楽だった
  • mayoko君が座るだけだった−と言っていたが今年の予選はインフラに勝負ポイントがあり,リモートだったこともあり協力しにくかったなーと.

本戦ではそれぞれの良いところを活かして100万円取りたい.

追記

  • 2019卒の新卒です.ぼちぼち就活します. − Twitterやメールなどで声を掛けていただけたらほいほい話を聞きに行きます.