概要

  • hikalium参加記, megumish と「受験生の仇」というチームで参加した
  • 最終13980点で学生枠8位で通過
  • みんなやってそうなことをやり、強運で殴った
  • repo: https://github.com/kmyk/isucon8-quals

記録

  • (5:00)
    • なぜか目が覚める
  • (6:00)
    • 寝直そうとしたけどできなかったので起きることにする。起床フェイズAC
  • (8:00)
    • 今年はCentOSという情報を得て軽く予習
    • GitHubのprivate repoを切っておく
  • (9:00)
    • 昼食用にとおにぎりを作ろうとする。三角形に成形する必要性は薄いことに気付く
  • 10:00
    • 開始 (初期スコア 500点)
    • megumishにssh鍵の登録をまかせる
    • その間に触ってあそぶ 座席の予約をするアプリケーション
  • 10:18
    • torb/ /etc のバックアップをとりgitにのせる
  • 10:35
    • deploy.sh みたいなのを書き終える
  • (11:00)
    • hikaliumにh2oをnginxで置き換えるべく頑張ってもらう
    • アプリケーションのコードを眺める
    • nginxは動いたが吐かれたcsvが途切れる問題が発生
    • nginxあきらめ
  • 11:59
    • hikaliumがh2oのログの設定をしてalpが使えるように
  • 12:24
    • loginが遅かったので高速化を試みる (点数変わらず)
  • 12:35
    • gunicornのworkers数を増やすとなぜかloginが速くなることが判明 (500 -> 1000点)
    • meumishが裏で SELECT * FROM ... の部分を潰すなどしてた
  • 12:42
    • csvが大きい気がしたのでとりあえずgzipしてみる。どこに効いたかは不明だが点数は上がった (1000 -> 1500点)
  • 13:03
    • hikaliumがPythonのprofilerの設定してくれた
  • 13:05
    • sheets tableは1000行固定で増減なしなのでPythonの dict として読み込むように (点数変わらず)
    • どうみても効くと思ったのになあ、ってなる
  • (14:00)
    • unix domain socketっての練習ではまだやれてないしやってみたかったんだよねという気持ちから時間を溶かす
  • 14:11
    • megumishがh2oで304どうこうをしてくれる
  • 14:45
    • hikaliumが鯖1,2をそれぞれweb,dbとして分ける設定をしてくれる
    • /initialize が失敗するので ssh isucon@${ip2} ./torb/dh/init.sh させてた
  • 14:51
    • 時間を溶かした事実を言わずにmegumishにしれっと「unix domain socketってあるらしいじゃん、やってみてよ」と言ったらやってくれた
    • やはりこういうのは違う人がやるとなぜか上手くいくんだなあという気持ちになる (最悪)
  • (15:00)
    • このあたりでアプリケーションのコードをほぼ触ってないことに気付く
  • 15:07
    • get_events() のN+1問題をちょっとましにする
  • (16:00)
    • まだ点数が1500点ぐらいなので焦り始める
  • 16:24
    • get_events() のN+1問題を根絶 (1500 -> 1900点)
    • 見るからにバグりそうですごくやりたくなかったが、ついに焦りが勝ったのでやった。やったら意外と一発で動いた
  • 16:41
    • get_users() のN+1問題を対処 (1900 -> 2900点)
    • get_event() より get_events() が速いのでこれを呼ぶ形。他も同様にやる
    • このあたりでだんだん楽しくなってくる
  • 16:45
    • loginが遅いのはworkers数増やすと解決するんですよって言って増やしたら点数が上がった (2900 -> 3400点)
  • (17:00)
    • あと1時間で最低でも3倍ぐらいにしないとだめなので必死
    • 再起動の確認してもどうせ修正間に合わないしやらなくていいよねという気持ちになる
  • 17:01
    • get_events() は速くしたけど get_event() はまだだったのでやる (3400 -> 6400点)
  • 17:06
    • hikaliumがDB周りの設定をいい感じにしてくれる
  • 17:32
    • 速くしたはずだけど計測結果は get_events() が遅いと言ってるので追加で頑張る (6400 -> 7900点)
  • 17:44
    • get_user()get_events() を叩くままになってたので get_event() に向ける (7900 -> 11000点)
    • とりあえずh2oのログ出力などを消しておく (11000 -> 12000点)
  • 17:50
    • ガチャ。9000点や0点が出てびびる
  • 17:54
    • 最後で運よく13980点を引いてhighest更新 (12000 -> 13980点)
  • 18:00
    • 終了 (最終スコア 13980点)
    • 再起動試験の通過を祈る

感想

  • 楽しい
  • 予選通過うれしい

反省

  • まるで優先順位を付けれていない
    • 実質3時間しか働いてない
    • 本戦では誰かひとりコードを書かない監督役を立てた方がよさそう