読者です 読者をやめる 読者になる 読者になる

tkuchikiの日記

Linux やプログラミングについて書きます。

ISUCON6 予選2日目2位通過しました

@hilotter さん、@Konboi と流れ弾として ISUCON6 予選2日目に参加して2位通過しました。
使用言語は Go で、私は足回りを整えて少しコードを書きました。

謝辞

運営の皆様ありがとうございました。
とても充実した時間を過ごすことができました。

やったこと

前日まで

  • メンバー各自で pixiv 社内 ISUCON 2016 を解く
  • 環境セットアップスクリプトを用意する
    • ユーザ作成、nginx、MySQL、Redis を簡単にいれられるようにしておく
  • デプロイスクリプトを用意する
    • 1台だけなので rsync & sshmake allsystemctl restart する
  • alp の修正・PR merge
    • PR をくださった @vzvu3k6k さん、issue 報告してくださった @hilotter さんありがとうございました
  • nginx、MySQL、Redis の設定ファイルを作っておく

当日

起床成功

10:00 ~

  • Azure の VM 起動
  • アプリのコードを Bitbucket に push
  • isuter.go に patch をあてる
  • デプロイスクリプト微調整
  • nginx のログ集計
  • mysqldump をとる
  • pt-query-digest する
  • slowlog-sorter で遅いクエリを眺める

11:00 ~

  • go 以外の systemd の設定を消す
  • 他の二人がコードを読んでいる間にミドルウェアとアプリの再起動確認をする
    • reboot が 1, 2分くらいで終わるので楽だった
  • とにかく htmlify の正規表現が重いので初期データだけでも Redis にのせる準備を始める(@Konboi)
  • index をはる
  • url_for を消す

12:00 ~

  • ベンチ回す前に毎回ログを truncate するのが面倒になったのでデプロイ時にやるようにする
  • entry のクエリを修正(自己結合)
  • コードを読んだり、PRをレビューしたり

13:00 ~

  • SELECT COUNT を変数に持って実行しないようにする
  • isuda から直接 star テーブル読むようにする(@hilotter)

14:00 ~

  • login 時に session にユーザ名をいれて DB を参照しないようにする PR を作る(結局 merge していない)
  • アプリを Go で動かすようにしてから一度もスコアがでなくて絶望感漂う
    • perl のアプリでベンチを回したときに 2000 くらい出た以外はずっと 0
  • Go で書いたキャッシュ作成スクリプトが遅すぎて Perl で書き直す(@Konboi)
  • キャッシュを作っている間にキーワードの追加・削除時にキャッシュをどうしようか考え始める(@hilotter, @tkuchiki)

15:00 ~

  • キャッシュができたのでベンチを回す

f:id:tkuchiki:20160920150231p:plain

  • スコア 0 からいきなり 118245 になって全員のテンション爆上げ
    • ダッシュボードの Messages に色々出ているからだめかもという話しをしていたら idobata で PASS になっていれば大丈夫という発言を見て安心する
  • キャッシュの整合性を直すことは諦めてスコアの再現性を高めることに注力しようということになる
    • この判断を即決できたのが良かった

16:00 ~

  • ベンチを回すたびにキャッシュを作り直すスクリプトを作る(@Konboi)
  • 再起動確認を始める
    • Redis より isuda が先に起動しようとして起動に失敗することがあったので依存関係を設定
  • unix domain socket を使うようにする(問題が出たので元に戻した)
  • 以降、ひたすらベンチを回して再起動確認する、の繰り返し

感想

キャッシュの整合性は全く取れていないので Messages が一つでも出ていたら Fail または大幅に減点されていたら予選通過は無理でした(石とかまさかり投げないで...)。
我々の戦略で唯一良かったのは(というと二人に失礼ですが...)、アプリとしての正しさは無視して、すぐにスコアを安定させる方向に振り切ったことだと思っています。
スコアは一番良いときで 19万くらい低いときで 8万という感じだったので、多分大丈夫だろうという感じではありましたが、稀に Fail することがあったのと低いときのスコアが出たら予選通過できなさそうな雰囲気だったので、結果が出るまではだめかもと思っていました。
最終的に運良く予選通過できましたが力不足を感じたので、日々精進しなくてはならないなと改めて思いました。
本選は実力で結果を出したい...

あわせて読みたい