ISUCON13に「炉端焼きはどう生きるか」というチームで参加した。
最終スコアは約10000点で時間切れ。
復習として準備したことと当日やったことをまとめる。
本番前の練習
手を動かさないと当日あたふたするので参加メンバーで練習をした。
勉強
Amazon.co.jp: 達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践
を読んだ。
特に付録の攻略実践を実際にやってみて点数が上がる感覚を体験したのがよかった。
EC2インスタンスを建てて過去問で練習
環境は以下のAMIをありがたく使わせてもらった。
» matsuu/aws-isucon: ISUCON過去問環境をAWSで再現するための一式まとめ
実際に使ったのはisucon12-final
のもの。
提供されているAMIを使ってSession Manager接続できるようにEC2インスタンスとVPCをTerraformで構築した。
» Session Manager でログイン可能な EC2 を建てる
練習を通して知見を記録
今までのISUCON参加で得た知見をHackMDで共有している。
練習を通して改善できる点や変更点などが挙がったのでドキュメントを更新していった。
最初にインストールするものをItamaeで管理
初手でインストールするものや追加する作業ディレクトリなどは毎回同じなのでItamaeで管理するようにした。
それほど多くないとはいえ、本番の慌てた状況で手作業をやるのは精神的によくないので、なにも考えず実行できるようにしておいてよかった。
GitHubのプライベートリポジトリに用意しておいて以下の手順だけで初期設定を諸々できるようにしておいた。
レシピの実行にはmitamae
を使っている。
$ git clone リポジトリURL isucon-prepare
$ cd isucon-prepare
$ curl -L https://github.com/itamae-kitchen/mitamae/releases/download/v1.14.0/mitamae-x86_64-linux.tar.gz | tar xvz
$ sudo ./mitamae-x86_64-linux local roles/isucon.rb
参加登録
近年のISUCONは人気が高く、参加登録フォームが公開されたら数分で埋まってしまう。
前回は気づいたら埋まっていたので今回は公開時間に待機して参加登録フォームが公開されたらすぐに登録した。
本番
開始直後
開始直後は用意されているCloud Foramtionで環境を立ち上げ、起動したら準備しておいたItamaeのレシピを流して初期設定を済ませた。
選択した言語はRuby。
他のメンバーはDBへのCRUDを調べたり、マニュアルを確認したりと分担した。
準備を終えたら初回ベンチマークを実行して初期スコアを確認。
主にやったこと
インデックスを貼る
インデックスがあまり張られていなかったのでかなり効果があるのではと想像していたが、それほどでもなかった。
ただ、他の改善をしていくと新たにインデックスを貼る必要が出てきたので、それを貼っていくとスコアが上がった。
インデックスを張る候補はpt-query-digestで確認して上位から実行した。
» pt-query-digestでMySQLのスロークエリを集計する
N+1問題を解消する
kataribe
でトータル時間が長いURLを確認して、N+1問題に対応していく。
やっていくとまたインデックスを張る必要のらるカラムが出てきたので順次張っていった。
アイコンファイルをDBに保存するのをやめる
アイコンファイルをDBに保存するのをやめてディスクに直接書き込むように変更。
select * をやめる
無駄なカラムを取らないようにした。
できなかったこと
PowerDNSが使っているDBにインデックスを張っていくと負荷が上がってきたので別サーバーに移動することを検討。
ところが設定を変更したところでベンチマークができない状況になってしまった。
最終的な動作確認はベンチマークに頼っていたところがあったのでここで待ちにはいってしまいあえなく戻すことにした。
ベンチに頼らない自力が必要。
本番後
今回修正したファイルをGitHubのプライベートリポジトリにアップロードして後で復習できるようにしておいてフィニッシュ。
また次回。