ISUCON9 オンライン予選 2日目に @hilotter、@Konboi と流れ弾で参加し予選通過しました。
運営の皆様、ありがとうございました。今年もとても楽しかったです。

チームメンバーのブログ

下準備

覚えている範囲では以下に取り組みました。

  • alp v1 release
    • Pull Request を送ってくださった方、issue 報告してくださった方、ごひいきにしてくださっている方、いつもありがとうございます
      • 引き続き要望や Pull Request お待ちしています
      • GitHub issue / Pull Request は日本語でも英語でも大丈夫です
    • GitHub の README を日本語で書きましたので、使い方はそちらをご参照ください
      • alp regexp でどんなログでもいけるようになりました
    • v1 release 時に Go のコードだけで 3000行超えました
  • https://github.com/tkuchiki/wireray のリリース
    • benchmarker が送ってくるリクエストのヘッダを見るのに役立ちました
  • nginx, Redis, MySQL 8 の新し目の機能のキャッチアップ
    • 最後の一週間はこれだけやってました
    • と思ったけど、前々日は alp のバグ修正していました
    • あと、https://github.com/najeira/measure みたいなやつの実装もしました
  • pprof の素振り
  • deploy script の用意
  • Chef の Ubuntu 18.04 対応

やったこと

インフラ関連と一部コードの修正でやったことは、以下のとおりです。

  • Capistrano で Chef と app を deploy できるように調整
  • MySQL 5.7 -> 8
    • 多くの SELECT 文が ORDER BY DESC になっているのを見て、MySQL 8 の降順インデックスの出番だなと思いアップグレード
  • MySQL に秘伝のタレを適用
  • MySQL にインデックスを貼る
  • 複数台構成
    • Web + app x 2, DB x 1 という構成にしました
  • nginx の相互 try_files
    • ファイルがなかったら別のサーバにリバースプロキシ
  • nginx の worker_rlimit_nofile 調整
  • nginx の http2 対応
  • Redis のインストール
    • APT で入れるとハマるというような話しを聞いた気がするのですが、私は Chef で最新版を build して、config も自前の秘伝のタレを使ったのでハマりませんでした
    • これは 17 時過ぎにやったのですが、そこから 10 分くらいで Redis にセッションを載せるように app 修正してくれたので最高でした
  • Prepared Statements を無効にする

やろうと思ってやれなかったこと

  • bcrypt のコストを低くする
    • レギュレーションを読んですぐに、bcrypt なら stretching の回数は減らして良いのだろうと思ったので時間があったらやろうと考えていたのですが、時間が足りませんでした
  • クエリ改善
    • 2 人が N + 1 のクエリは直してくれたのですが、ちゃんとインデックスが効くようなクエリへの修正までは手が回りませんでした

やらかしたこと

今回、2 人のおかげで予選通過できましたが、私はいろいろミスってしまい、かなり足を引っ張ってしまいました…

  • 相互 try_files の設定ミス
    • nginx to nginx とするところを、nginx to app としていてベンチを通らなくしてしまいました
    • Konboi が直してくれました
  • nginx の max open files 不足
    • エラーの原因が nginx なことに気がつくのが遅く、結構な時間をロスしました
  • deploy script の設定ミス
    • 調整が甘く表示が壊れてしまったので hilotter に調査してもらいました
  • 全台同時に再起動した場合に app が起動しない
    • これはまだ原因がわかっていないですが、終了10分前に気が付きました
    • 残り2分で、systemctl start isucari.golang を実行すれば起動できることがわかったので、/etc/rc.local に sleep を挟みながら systemctl start isucari.golang を実行し続けるコマンドを書きました
    • ぶっつけ本番一発勝負で書いた for loop & sleep + systemctl だったので若干の不安はありましたが、予選通過したのでちゃんと動いていたようです

まとめ

今回は敗退してもおかしくないほどいろいろやらかしたのですが、2 人のおかげでなんとかなりました、ありがとうございます。 運営の皆様、いつも楽しいイベントを開催していただきありがとうございます。 本選もよろしくお願い致します。