これは旧eviry tech blogから移行した記事です。
millvi開発のtkです。 去る2018/09/16にISUCON8の予選に、弊社エンジニアのkawashige, yurakawaと一緒に出場しました。
僕は主にアプリの実装側の作業を担当しました。 予選当日までの準備や予選の日にやったことなどをまとめておきます。
当日までの準備
当日までの準備としては、以下のようなことをしました。
- ISUCON7の過去問を解く
- mysqlのスロークエリログの設定方法と調査方法の確認
- 当日用のgitリポジトリの用意とソースコードを共有するまでの手順の確認
- ソースコードをデプロイするためのツールを準備
何はともあれ「ISUCONは過去問をする」と書かれていたので、過去問の環境を用意しました。(参考: GitHub - matsuu/vagrant-isucon: ISUCON過去問を構築するためのVagrantfile集) 今年はGoで挑戦すると決めていたので、ライブラリの確認と実装の雰囲気を確かめました。
また、ISUCON7がmysqlだったこともあり、mysqlでのスロークエリログの設定方法とmysqldumpslowの使い方を練習しました。
当日のソースコードを管理する場所の確保と更新するための手順の構築をする必要があったので、これらを事前に準備しました。 ソースコードは社内で利用しているgit環境にリポジトリを作って、そこで管理するようにしました。 更新したソースコードを反映させるための手順として、「ソースコードをpull -> サービスの再起動」を行うためのスクリプトの準備も合わせて確認。
僕が行った事前準備の大まかなものとしては以上になります。
予選当日の作業
当日はソースコードをリポジトリに登録し、更新を反映させるスクリプトの配置を行いました。 Goのライブラリ管理がISUCON7のdepからgbに変わっていましたが、Makefileを参考にしながらデプロイのためのスクリプトを作成しました。
次にスロークエリログの設定。 ISUCON8のDBがmariadbで驚きましたが、mysqlのときの設定を同じようにできたのでスムーズに行きました。 実際に確認してみると極端に遅いクエリは見つからず、今年はソースコードでボトルネックになっていそうだと判断できました。
ここからは実装の確認と修正に着手しました。
kawashigeと2人で作業分担してソースコード上での改善を行いつつ、yurakawaがインフラ周りの調査と改善を行う、という当初の予定通りに進めました。 kawashigeがgetEvent周りの大きな修正に着手してくれていたので、僕はその他の改善できそうなところの調査と冗長な実装になっている箇所の修正、必要があれば修正内容のレビューを行いました。
感想
そんな感じで作業していたらいつの間にか終わっていた、というのが率直な当日の感想。 結果は予選敗退でした。残念無念。
あとから実装を見直したり他の人の振り返り記事を読んで、もっといろいろできそうだったな、と思いました。 結構大きめのボトルネックを探しに行ってしまったので、ある程度調査してめぼしいところが見つからなかったら目についた小さな改善点をどんどん試していけばよかったかなと。 それ以外にも、当日のブランチの分け方やデプロイ方法など、まだまだ改善できるところがありそう。
普段の業務とは違う作業になり、実装だけではなく、各種ツールの使い方や目的にあった手段の検証など、学ぶことも多かったです。 これを励みにして、今後も精進していく所存です。