ISUCON7 予選感想

ISUCON7にチーム「焼肉ジャンボチキン」で(自分は初)出場して17位でした。本戦出場は18位までだったので、ギリギリの予選通過でした。ichyoさんとnatsugiri君と参加しましたが、だいたい全部ichyoさんがやってました。この記事を公開するのは超恥ずかしいですが、感想書くまでがISUCONということで・・

レポジトリ https://github.com/krtx/isucon2017-production

スコア推移
f:id:krtx:20171023230259p:plain

ツールとか

言うほど使ってたわけではないですが・・

アプリはgitで管理、各自トピックブランチ上で実装してできたら本番でベンチマーク、よさそうだったらmasterにマージのわりと真面目な流れで進めていました。一応PRにしてレビューっぽく一瞬眺めたりしましたが、完全に無意味でした。また、ブランチとスコアの対応の管理が雑だったので、ベスト時どうしてたっけ?となる事態に陥っていました(どうやってリカバーしたかというと多分こうだっただろうという推察でやってた気がする)。

scrapboxは試しにと思って使ってみたのですが、記法に慣れないということで文句を言われました。そんなに悪くなかったですが、コードのハイライトができるわりにコードのコピペをすると全行の先頭に半角スペースが入るのが微妙だった。

(半)時系列でやったこと・記憶に残ってること

  • まさかの複数台構成で特に自動化もしてなかったので3台すべてにマニュアルで事前に用意していた手順をやる。1時間くらいかかる
    • 練習してないし複数台無理ではの空気になる
  • プロファイル見るとDBボトルネック、アイコン画像の読み出しで詰んでたので、早い段階でいちょうさんが画像のキャッシュをやる。やったことはhttp://dsas.blog.klab.org/archives/pixiv-isucon2016-5.htmlに書いてあったこと大体そのままだったと思う。これでスコアを取ってみると、結構いい感じだった気がする。1台でやっても2台でやってもスコアが大して変わらなかったので、なんやねんみたいな空気になる(画像の更新日時をあわせる処理はしてなかったので、多分2台でやったときキャッシュの効果はなかったはず)
  • いちょうさんがどこかのタイミングで何かのインデックスを貼る。早くなったっぽい
  • fetchおそすぎなので、なんとかしようとしてしまう(レギュレーションを読まないアホ)。頑張ってSQLを書くが、全く効果があがらず空振る
  • 実際は /icons へのアクセスが一番重かったのに、alp の出力になぜか /icons が含まれておらず、ボトルネックを勘違いしていたことに気付く。この辺でfetchを速くするのを諦める
  • fetchUnreadを雑にキャッシュしようとするが全くスコアに寄与しない。この辺でいちょうさんがhavereadを消す(後で再起動試験に落ちそうであることが分かったので直してた)。web1台、db1台の方針で決定する
  • ずっと使ってなかった方のwebホストを使うとなぜかスコアが跳ね上がる現象が発生。nginxか何かのキャッシュが悪さをしているのでは?と疑心暗鬼に陥り、/var/lib/nginx/proxyを消してみたりする。消すとスコアがあがったのでこれかなと思ったが、その後もスコアはぶれまくっていたので、気の所為
  • 突然mysqlが立ち上がらない問題が発生する。スロークエリログが9Gくらいに増えておりディスク容量がほとんどなかったせいであることが判明したので、ログを消す
  • もう何もできないので諸々パージしてベンチガチャをやる。21万点が出たところで止めて、終了。20分くらい残ってたと思う

感想

とにかくベンチを取るたびにスコアがぶれまくったのと監視対象が足りなかったことで改善の方針が全く立たずほとんど迷走してたのがつらい。後半何もできなかったし・・・。webを1台にしたのは予選通過を考えれば良かったと思う。あとは練習でhttp://dsas.blog.klab.org/archives/pixiv-isucon2016-1.htmlをなぞるのをやってたのが良かった。正直、なぜ予選通過したのか、という思い。練習で2016年の予選問題をやったときは結構できたので、やっぱりインフラ力が低すぎた。本戦は惨敗だけは避けるようにしたい。

反省

心構え系

  • レギュレーションを読む
    • アプリケーションの使われ方を考え、全部はやくすればいいというわけではないことを知る

インフラ系

  • 監視対象が足りなかった。少なくとも、ネットワークはどう考えても絶対必要・・・。あとディスク容量も
  • alpでなぜ/iconsが見れなかったのかを調べる。場合によっては別のツールを探す

知識系

今回特に駄目だったのは

かな・・

オペレーション系

  • ベンチマークのスコアは毎回消えるし、どの状態でどれくらいのスコアが出たかが分からなくなるので、スコアとサーバの状態の対応を保存しておいた方が良さそう。あと今あるバイナリがいつ作ったやつか分からんも発生したので、バイナリ名にコミットのハッシュをくっつけるとかした方が良いかもしれない(そのときはバイナリ自体のハッシュを見た)
  • 最初の環境設定の手順は自動化する