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 点だったためどれがどの程度効果があったかは不明です。
雑感
- メトリクス収集してアタリをつけられるようにするのはやはり必要と思った
- チーム構成にもよるかもだけど 午前方針ぎめ、飯食いながら相談、1時間前まで作業、30 分まえまでに落とし所に収束させる、30 分で再起動確認という流れで考えてたけど間違ってはいないかなと思う。
- 点数が正の数になって景気つけようとしてたけど Fail 0 だった
- いつの間にか 307 点ぐらいとったけど気のせいレベル
- ボトルネック部分把握した所で「競プロ勢有利な問題じゃん」と叫んでいた。
- 実際にどうかは知らない(競プロ雑魚勢の感想)
- 途中というか最初から make 叩くだけでは Go アプリのビルドが成功しなかった
- 今回は複数環境を用意したり linux 上のユーザをわけたりはしなかったが特に不都合はなかった
- 以前参加したときのように個々で修正して個々でベンチマーク実行などを行うようなことをしなかったため?
- 秒速5センチメートルは未視聴です(君の名は。は先週観ました)
道に迷ったおばあさんを待ち合わせ場所にデプロイしていた #isucon
— nise_nabe (@nise_nabe) 2016年9月17日
さくっと newrelic 入れて動かしたら アプリが大体 CPU 使ってたからこれクエリ勝負じゃねーなと思ってた pic.twitter.com/KOQoAdFzbX
— nise_nabe (@nise_nabe) 2016年9月18日
コミットログです #isucon pic.twitter.com/u520RWnqVU
— nise_nabe (@nise_nabe) 2016年9月18日
昼食
260 円