チーム「さばかんちゃーはんかれー」でISUCON8に参戦してきました。

チーム「さばかんちゃーはんかれー」でISUCON8に参戦してきました。
最後fail出てしまったんですが、終了間際のスコアが29000ほどでした。いずれにせよ本戦には届きませんでしたね。
個人的には2年ぶりの3度目の挑戦だったので、今年こそはと思い、数ヶ月前から同僚に声かけをして、 過去問練習したり、スクリプトの準備をしたり結構頑張ってきました。それだけに悔しいです。
しかしながら一人ではここまで戦えませんでした。一緒に戦ってくれた @matsukaz, @kz_morita には感謝の限りです。
1人チームの人すごい。

チームでやったこと

起床 - 10:00

昼飯を買い込んで、オフィスに集合しスタンバイ。
前日にメンバーに余裕を持って来いと偉そうに言ってた自分が開始ギリギリでした。
セッティングしといてくれてありがとう。

10:00 - 11:00

  • レギュレーションの読み込みと、ログイン環境の整備。あとappやconfをリポジトリにぶち込んで行く。
  • netdata, kataribe, pt-query-digestをインストール。
    • その過程でh2oの存在に気づきチームがざわつく。
    • h2oのパフォーマンスも十分かつ、nginxに置き換えたところでそこまで仕事をさせる場面はなさそうと判断し、h2oのままで行くことに決める。
  • 参考実装をgoに切り替えて初期ベンチ。1000くらい

11:00 - 12:00

  • 事前に仕込んでいたスクリプトを今回ように修正
  • netdata用にポートを解放
    • netdataでCPUを使い切ってることを確認。特にmysqlがCPUを食っている
  • my.cnfをシンボリックリンクにしたところmariaDBが読み込んでくれず若干ハマる。結局元に戻す。
  • カーネル系の設定をとりあえずぶち込む
  • for update を一部クエリから雑に剥がしてみてベンチ。1100くらい

12:00 - 13:00

  • pt-query-digestが動き始める
    • 情報を元にindexを追加
    • indexが効くようクエリを修正

13:00 - 14:00

  • kataribe用にh2oのログを調整
    • ルートのアクセスが多く重いことを確認
      • getEvents -> getEventの多段N+1がやばいので修正を開始
  • h2oの静的ファイルの304対応

14:00 - 15:00

  • getEventのN+1を修正しベンチ。20000くらいに跳ね上がる

15:00 - 16:00

  • この辺りでサーバを複数使用することを検討
    • app2台とDBで分離する方針に決定
    • DBの分離だけ先に対応
      • 鈴木明さん問題に遭遇。初期化shellの接続先をDBサーバのhostに修正。
      • CPUのボトルネックがappのみに
  • この時点で26000くらい

16:00 - 17:00

  • DNSラウンドロビンでappを2台に振り分ける
    • appのCPUに余裕ができる
  • 再起動対策でDBの暖気設定を入れる
  • h2oのmaxconnectionを引き上げ
  • sheetsテーブルを使用しないよう修正
  • ベンチがfailしまくりだす

17:00 - 18:00

  • getEventで既存コードを異なる挙動になる可能性のある箇所を修正
  • 怪しいコミットをrevertし再ベンチ。29000くらい
  • しかし最後またfailしてしまいfinish

良かった点

  • 割と早めにgetEventに対応でき、一時上位争いに食いこめた
  • netdataがすぐに入れれてボトルネックもある程度絞れるので超良かった
  • profileツールのインストール,on/off,プロファイル実行周りをスクリプト化していたので、プロファイルを取るのが捗った
  • アプリのビルド、再起動周りもスクリプト化していたので捗った
  • h2oをそのまま使って良かった。nginx入れてもやはりあまり効果はなかったと思う。

反省点

  • my.cnfなどの環境構築周りでミスってかなり時間を使った
  • 不必要な暖気設定のために、MariaDBのバージョンをあげるためにMariaDBを再インストールする労力を割いてしまった
    • レギュレーションをちゃんと読めていなかった
  • 3人の役割分担が曖昧で冗長に作業をしたり、手が止まる時間があった。

感想

結構戦えた感触はありました。
夕方頃に暫定1位になったりして興奮したりもしましたが、最後は力不足でスコアを上げきれませんでした。
また、提出スコアが再起動後に最終試験に行うものと勝手に思い込んでしまっており、DBの暖気設定を入れるなど無駄な時間を使ってしまいました。
マジでレギュレーションはちゃんと読まないとダメですね。。。
来年またリベンジしたいと思います!