読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

ISUCON夏期講習で叩きのめされて来ました

ISUCON夏期講習に参加してきましたが, songmuさんのブログ記事を参考にしなければ手も足も出なかった程度に惨敗してきました.

というわけで, 作業ログとスコアを晒してみます.


初期状態: 655 tickets

VagrantでVMを立てて環境構築を済ませていましたが, L社からAWSが提供されたのでそちらで作業をすることに.
Bitbucketのプライベートリポジトリにコードをおいて, ローカルで作業して, pushして, サーバでpullして... という作業の流れになる.
余裕があれば, そのあたりはCinnamonとか使って自動化したかったですね.

DBアクセスの処理時間はいろいろ悩んだ結果, Devel::KYTProfを使ってチェックする事に.
この辺りも予選ではどのモジュールを使うか, しっかり決めておいた方がよさそう.

recent_soldテーブルを作る: 764 tickets

最近売れた10件のチケットを表示するrecent_soldのDBアクセスがすごい重い感じだったので何とかする.
stockテーブルから引っ張ってくると, WHERE句でNULLでない事を指定する必要があるので, idとvariation_id, seat_idを格納するrecent_soldテーブルを作って, チケット購入時に購入したチケットに該当するvariation_idとseat_idを格納するようにした.

recent_soldにおいて, stockテーブルではなくrecent_soldテーブルから最近売れたチケットを求めるようにすると, WHERE句をまるっと消せるので, ちょっと高速化できた.

購入時のORDER BY RAND()を消す: 807 tickets

チケット購入時に, ランダムに開いている席を選ぶ為にORDER BY RAND()を使っていたので, これを消せば多少早くなるのでは? ということで消してみた.

ベンチマーク側で, 席の配置がランダムでなければNG... という事になっていれば使えないテクになりますが, 何度かベンチマークを走らせてFAILせずに通ったので, 「行けそうだ!」と採用.

懇親会で@さんに聞いた所, 「本当はランダムでなければならないようにするつもりだったけど, ミスで確認できていなかった」という感じらしいです.

力付きてsongmuさんのブログを読み, インデックスを張る: 1028 tickets

インデックスを張ると一気にスコアが上昇! ...で, これが自分の本日最高スコアとなりました.

nginx導入, 静的ファイルをnginxで配信しようとするも失敗

次はnginxを導入して, 静的ファイルをnginx側で配信しようと画策したのですが失敗, そうこうしているうちにタイムオーバーとなりました.

最終的に, AWSを使った人(全体の2/3くらい?)の中では2位でしたが, moznion師がVMで200 ticketsから800 ticketsまで伸ばしたそうなので, もしもmoznion師もAWSでやってたら上位3位には入ったのでは? という感じだったそうです.

個人的には, アーティストとかの情報をDBに持つ必要あるのかなあ...? と思ったので, アプリケーション側で決め打ち的に持たせるようにしたかったのですが, その辺にチャレンジする時間が足りなかったのが残念です.


お昼に@さんと@さんと食べ放題のカレーを食べに行った所, 自分の空腹の限界を見誤って大変なこと(満腹を越えた超満腹)になってコンディション最悪, という状態で望むことになりましたが, 何とかISUCON夏期講習を戦い抜くことができました(カレーの件は100%自業自得ですが!).

ちなみに, ISUCON予選は@師と@, そして私の3人の学生チームで挑もうか...? という話になっていますが, ...どうなることやら.
ただISUCONの予選まで時間はないので, このチームで望むなら, それぞれ担当分野を作ってそれを磨いていくのがベストスコアへの近道になりそうです.

ISUCON, 難しいですがとても楽しかったので, 予選も楽しみながらいい結果を残せるように, 予習を頑張りたいと思います.

@さん, @さんはじめLine社の皆様, 貴重な機会をどうもありがとうございました!