はじめに
職場の同僚(@noda_sin, @T28_tatusya)と3人で「予算ZERO」というチームを組み,ISUCON7の予選2日目に参加した.集計されたスコアは383,085で,407チームのうち総合4位で通過できた.
なんか予選通過しちゃったよ → ISUCON7 本選出場者決定のお知らせ : ISUCON公式Blog https://t.co/F3JuLCCQ0W #isucon #isucon7
— Toshiya SAITOH (@stoshiya) 2017年10月22日
2日間総合で4位? まじで?
— Toshiya SAITOH (@stoshiya) 2017年10月22日
4位!! → ISUCON7 オンライン予選 全ての順位とスコア(参考値) : ISUCON公式Blog https://t.co/nef5fMK7Ax
— Toshiya SAITOH (@stoshiya) 2017年10月23日
事前準備
ISUCON6予選のイメージをAWS EC2上に再現してもらっている間に,アプリケーションのソースコードを読んで,内部構成について確認してみた.言語は3人ともそこそこ読み書きできるnode.jsにした.
ISUCON6予選の問題はマイクロサービスのように2台サーバがいて,それぞれのWebAPIをasync/awaitなHTTPクライアントで呼び出す箇所が散見されたので,2台のサーバをマージしてモノリシックデザインに変更したり,ループ内で直列的な処理がかかれていたらPromise.all()で並列に処理するなどの修正をしたコードを2人に解説した.
あと用意してもらったEC2インスタンスでubuntuのための必要最低限のセットアップ諸々を洗い出し,予選が始まったときの役割分担とかざっくりな流れとかを決めておいた.
予選開始直前
1日目と同じく開始時刻が遅れて13時からとなったので軽く水分補給もしておいたw
序盤
まずはレギュレーションをさらっと確認.ISUCON7の予選では3台のインスタンスがあったのでssh公開鍵もろもろのセットアップと実装言語の切り替えに手間取った.アプリケーションサーバのソースコードと/etcをgitリポジトリにいれる作業は@noda_sinが代わりにやってくれたので助かった.私とY君はアプリケーションのコードを読み,@noda_sinはMySQLのチューニングに取り組んだが,序盤はほとんどベンチマークを動かせず,スコアもほとんど上がらなかった.
中盤
ベンチマークツールの結果に遅いエンドポイントを教えてくれるのがとても親切.これに沿ってポイントを絞って若手メンバーの2人が取り組んでいるので,私はリポジトリからgit pullしてリスタートしてベンチマーク走らせつつ,nginxのaccess.log/error.logをSlackにコピペするという裏方に徹した.あとPromise力もSQL力もミジンコ以下だったのもある.
2台のアプリケーションサーバで静的ファイルを共有する必要があるという場面だけは,NFSサーバとクライアントのための設定をし,リブートしてもファイル共有ができていることを確認した.本当にこれが唯一の作業かも.
ただリブートした後からベンチマークが走らなくなってしまったり,走ってもスコアが初期状態に戻ったりでふりだしに戻ってしまった.原因は1台のアプリケーションサーバの実装言語切り替えたあとのスタートアップへの設定がきちんとなされていなかったことによるものだった.もっと早めにブートアップ後の挙動を確認しておくの大事.
終盤
中盤からお荷物状態だったので,せめてインスタンス内でクラスタ構成にしてスコア上がるか試したくpm2をインストールして動かしてみたが「5000番ポートは使っているよヴォケ」というエラーが吐かれて,おっさんは若者の邪魔はしないようにした.nginxのevents周りをチューニングを調べて試したくらい.
若者2人は,着々とボトルネック解消を続け,特に圧巻だったのは終了1時間前からスコアが他チームに開示されなくなってから桁を2つほどあげ,ついにはトップ5くらいに食い込んだ.また残り15分を切った頃にブラウザで確認したらアバター画像の取得に失敗していた.残り5分を切ったところでタイポを見つけ,なんとか時間内に2台のサーバ上で編集して失格を逃れた.
当日の作業
反省点
- Promise力不足
- node profiler使わなかった
- Webアプリにnewrelicを組み込まなかった
- DB用インスタンスにもnginxとWebアプリを動かせばよかった
- fastify化できなかった
- cluster化できなかった
- redisとか使わなかった
- リスタートとかのちょっと便利なスクリプトを書けばよかった
- スコアの推移とかを記録しておけばよかった
本選に向けて
少しでもスコアアップに貢献できるように,この1ヶ月間は本選の準備をしておこうと思います.まずは反省点にあげた部分をそつなくこなせるようにしたい.
おわりに
ISUCONの運営スタッフ,参加者のみなさま,お疲れ様でした.ありがとうございます.本選で少しでも爪痕が残せるようにがんばります.8時間ぶっ続けは少々辛かったけど,ベンチマークのスコアが伸びていくとがモチベーションがググッとあがるのを,また体感したいものですね.