ISUCON6 予選参加記

ISUCON6 予選 9/17 土曜日に「応答5マイクロセカンド」で take4、Takky と参加していました。

参加当日からずっと風邪引いてたりしてたのでまともな振り返りはしてないですが記録として書いときます。 (箇条書きで同列っぽく書いてますが事実と主観が混在してます)

準備編

やったこと

  • 過去問練習会
    • Azure 環境の確認
  • newrelic のアカウント準備および使い方の確認

準備での雑感

  • azure の初期セットアップおよびリカバリで時間がかかる場合があるのでリストアはしっかりできるようにする
  • newrelic は CPU やメモリは確認できたが MySQL のクエリおよびアプリケーションについては使い方が確認できなかったので当日は使わないことにした
  • 3人のスキルセットから php を使うことを検討したが php.ini のチューニングに時間がかかりすぎる場合があるので Go に変更
    • ここで Go を書ける人が1人しかいないのでアプリ担当が1人になる

当日編

午前

  • 準備を完了する
    • アプリデプロイ
    • メトリクス収集用設定
  • アプリに一通り触れて使用感を確認する
  • アプリやSQLを眺める
  • 方針の決定

わかったこと

  • isuda, isutar, isupam の3つのサービスがある
  • isuda がメインサービスで isutar は http で通信 isupam は外部プロセス呼び出しで連携する
  • newrelic の結果より isuda > mysql >> その他で CPU を消費している
  • MySQL の slow query は出ていない
  • MySQL の general log から一部 SELECT の間隔が遅い
  • 初期状態は fail で 0 points

以上より

  • ボトルネックはアプリケーションとして作業する
  • 最も遅い所は / や /keyword で基本的に htmlify() があるのでこれを何とかする
  • その他こまごまとしたものは最後にまとめて対応か暇になったら都度対応

午後

  • keyword の完全オンメモリ化
    • initialize 時にロードする実装
    • 追加およびソートの実装
    • (削除処理は実はすっかり忘れてた)
  • htmlify のキャッシュ化
    • matcher のキャッシュ
    • アンカータグのキャッシュ
    • キーワード毎の htmlify のキャッシュ
    • キーワード追加時の htmlify キャッシュのパージ
  • SQL の不要なデータの取得をなくす

上記対応後でもずっと 0 点だったためどれがどの程度効果があったかは不明です。

雑感

  • メトリクス収集してアタリをつけられるようにするのはやはり必要と思った
    • prometheus + grafana で準備しようとしたけど間に合わなかったので newrelic を採用
    • sort by CPU でプロセスみれたのは便利
    • ただ newrelic の mysql プラグインが頑張っても動かなかったのでうーんという感じ
  • チーム構成にもよるかもだけど 午前方針ぎめ、飯食いながら相談、1時間前まで作業、30 分まえまでに落とし所に収束させる、30 分で再起動確認という流れで考えてたけど間違ってはいないかなと思う。
  • 点数が正の数になって景気つけようとしてたけど Fail 0 だった
    • いつの間にか 307 点ぐらいとったけど気のせいレベル
  • ボトルネック部分把握した所で「競プロ勢有利な問題じゃん」と叫んでいた。
    • 実際にどうかは知らない(競プロ雑魚勢の感想)
  • 途中というか最初から make 叩くだけでは Go アプリのビルドが成功しなかった
  • 今回は複数環境を用意したり linux 上のユーザをわけたりはしなかったが特に不都合はなかった
    • 以前参加したときのように個々で修正して個々でベンチマーク実行などを行うようなことをしなかったため?
  • 秒速5センチメートルは未視聴です(君の名は。は先週観ました)

twitter

昼食

260 円

f:id:nise_nabe:20160926121758j:plain:w300