tom__bo’s Blog

MySQL!! MySQL!! @tom__bo

ISUCON6予選に参加してきた

ISUCON予選1日目にチーム名Catechinで参加しました。
結果が出たら人権をロストする可能性があるので、結果が出る前に当日にやった作業を振り返ってみる。
本選出場者が公開され、学生枠で2位(学生全体では3位)で本戦出場が決定しました(=゚ω゚)ノ
最後までgolangで頑張りました。

10:00~ コンテスト開始

  • 用意しておいたansibleにsyntax errorと言われて驚く

10:20まで

  • インスタンスを立ててから10分後に再起動というレギュレーションと、sshできてもアプリのデプロイができていないという状態をみて、落ち着くまでじっくり待つ

10:30頃

  • 初期実装のperlのままベンチを実行して1288点を確認する
  • 実装をgolangに入れ替えるもスコアが0でうなだれる

11:40まで

  • 環境変数の設定

    • golangのプロファイラ(pprof)を挟む
    • mysql,nginxでログを履くようにする
  • entryテーブルのdescriptionのうち、keyword部分をリンクに書き換えてる部分の

ORDER BY CHARACTER_LENGTH(keyword)

は重いしいらなくない?とかいいながら消す。最悪。

12:30頃

  • pprofをとったことで一番重いregexpでキーワードをリンクに変える処理をstrings.Replaceに変える。

    • (終了後string.Replacer()に変えて、正規表現のビルドを毎回やらないことで12万点を超えるという噂もあった。確認してない)
  • このあたりでkeywordの長さでソートすることで、長い文字列から順にリンクに書き換えていることに気づき修正

  • それでもスコア0で焦る

13:20頃

  • starボタンを押してもスターが出来てないことに気づきその修正が完了
    • perlだと初期でスコアが出ていたことを思い出し、開始3:30でようやくスコアが出たくらいで死にたくなる
    • "学生枠は10枠"という単語が飛び交って、パニック状態

14:20頃

  • regexpを変更して長い文字列から順にreplaceする実装方法が悪くhash化まで適当に用意して修正
  • entry表示時にstarを表示する部分が自身にhttpリクエストして確認している部分を修正

15:00頃

  • 正規表現をreplaceにしてもhtmlifyが激的に重く、全力でここを直さないといけないと悟る

    • 残り3時間でチーム全員のイライラがMAX。
    • どうして乗り切れたのかわからない
  • ベンチの初期状態であるエントリーに対するその時点でのキーワードをリンクに書き換えて持っておく方針に決定

    • 差分の更新だけして、差分のキーワードが元のキーワードに部分文字列として重複したり、deleteやupdateで記事の中身が変わることは無視すると決定。
    • 今考えると大胆な決定をしたが、精神的に限界でinsertupdateがあることには考えが及んでいなかった。
    • 同時に以下の予想もあった(過去問を練習しておいてよかった)
      • 他のチームが100Kを超えていたりして多少の減点はどうにかなるだろうという予想
      • はてなのstarが無限につけられることを知っていたので(きっとこれもそうなんだろうという適当な理由だった)、ここへのget,postでいずれは点数が稼げるのだろうという予想

16:15頃

  • 上記の変更が効いて6万点を超える
    • その時点で2位で逆に疑心暗鬼になる
    • status: PASSなら良いということでとりあえず安心する

16:30頃

  • エントリ中のリンクが他の文字として書き換えられているところがあり、困る

17:00頃

  • リンクの壊れは諦めて再起動チェックや細かい修正を行う
  • nginxの静的ファイル配信を設定

17:40頃

  • mysqlのパラメータを変えたりしてベンチを何度かとって6万を超えたのを確認して終了

雑な感想

  • 今回はミドルウェアのチューニングはほとんど出来なくて、アプリの正しい実装力がすべてになってしまった
  • pprofをとってボトルネックから手を出していこうと言っていたが、最後までhtmlifyがボトルネックのままだった
  • pprof上重いところ以外は見ないと徹底していたので、limit offsetなどにとらわれずにすんだ
  • 途中で記事ごとのstarをサーバ自身にhtmlリクエストしているところだけはまずいと思いボトルネックと確認できなかったが修正した。(ここについては間違ってはいなかったと思う)
  • isucon3あたりから過去問で練習をしておいたので、/initializeでどのデータを保っているのかを意識出来たり、スコア配分からスコアをどう稼ぐかを考えられて良かった

その他

  • golang初期実装0点+初期実装バグでとにかくつらい
  • そういえばisupamが何をしてるかしらないままだった