遅くなりましたが、ISUCON4のレポートです。 まこぴーとchroneさんとともにチームぽわわで参加し、惨敗してきました。
2014-10-06 追記: 競技中に使ったレポジトリを公開しました。
事前準備
- メンバー三人で集まって、去年のnopasteアプリで練習
- chroneさんは初参戦なので雰囲気を掴んでもらう
- Ansibleを使っていこうっていう話になったので、プレイブックを書いて遊んでみる
- githubにprivate repositoryを予め建てる
- PayPalに対応してるっぽいので、ログインを試みるも何故か失敗
- 諦めてクレカ情報を直接入力
- どうなってるんですかgithubさん!!!
競技
10時くらいまで
- お題確認
- サーバのセットアップはchroneさんにお願いしスムーズにできた
- サーバは人数分準備
- 僕がコミット&実行確認をこまめに繰り返すタイプなので、書いたコードはすぐにデプロイしてテストに回したい!!
- サーバ一台だとインフラの調整とアプリの確認がかぶって面倒
- かといってローカルで同じ環境用意するのも面倒
- AMIがあるならそれを使っちゃえ!(って記事を去年見た気がしたので)
- 密かにUkigumoで自動デプロイする仕組みを作っておいた
- 書いたコードはすぐにデプロイしてテストに回したい!!
- あらかじめukigumo-agentを起動
- github-hookを設定してコミットしたら実行
- Github::Hooks::Receiverいじってたのはこれやるためだったんだけど、Ukigumoさんで十分でした。便利ですね!!
- 去年はサーバに入って作業する人(まこぴー)がかなり忙しそうだったので、なんとか解消したかった
お昼くらいまで
- nginxで静的ファイル配信とかMySQLのクエリ分析とか
- いっちーさんは早速Redis::Fastに手を付ける
- みんなもRedis::Fast使ってね!!
- あとUkigumoさんのおもり
- UkigumoとAnsibleのお陰で僕が何もしなくても、まこぴー氏が「nginxで静的ファイル配信したよ!」って言って数分後には確認できる状態になっていて便利
- これのおかげでページが真っ白になっているのに気がつく
- 普通に設定を書き換えるとMIMEの設定がなくなるらしい
- Ukigumo++
14時くらいまで
- chroneさんにMySQLのクエリ改善
COUNT()
している部分を一行SELECTだけにする修正とか
- 一部Redis::Fastに書き換えた版も一応スコアでる
- アプリが単純すぎてMySQLでもRedisでも大差ないスコア
- 自分の環境でmy.cnfの調整をしたら、MySQL gone awayしてしまってつらいことに
- Redisに書き換えたものの、reportのロジックには手をつけてなかったので、効果あるのではと
- MySQLだけ再起動したらそうなるらしいけど、ansibleのplaybookにアプリの再起動手順も含まれていたので全部再起動かかってたと思うんだけど・・・
- 結局サーバごと再起動しました(・ω<)
17時くらいまで
- workloadを上げるとfailが大量にでて/reportのチェックでコケる問題
- トランザクションとかFOR UPDATEの問題かと思ってSQLをいじくりまわす
- 初期データの考慮を忘れてたことに気が付き、初期化スクリプトを組む
18時まで
- workload変えてベンチ走らせたり最後のあがき
まとめ
- 初期化大事!!
- 社内ISUCONに参加したときも初期化で散々な目にあった
- Ansibleがあまり効果的に使えてなかった
- configいじるのが速いので、どうしても直接いじっちゃう
- 各個人にサーバ用意したけど、微妙に環境が違ってつらい