先週の1/25,26の2日間にかけて、社内ISUCONが開催されていたので参加してきました。
1,2人のチームで2日間のうちどちらかの日に参加し、4時間かけて本家ISUCONのような課題WEBサービスのチューニングを競う、という内容です。
出題者は弊社エバンジェリストの@takashabeです。
出題サービスのソースコードとベンチマーカを載せておきます。
github.com
作業内容はGitHubにpushしておきました。
github.com
当日の振り返り
参加者は合計15人。1日目に影響され、2日目にエントリーした方が何名かいました。
僕はスケジュール上2日目に1人で参加しました。と言っても実は全員ぼっちチームでした。チーム名は「https://goo.gl/6YBEht」です。短縮URLをチーム名にしました。
チューニングのお題としてはISUCON5と同じような構成で、Twitterを模したサービスでした。指定されたEC2に入るだけだったので、そのへんは本家よりカジュアルに参加できる感じでよかったです。
作業内容
とりあえずサービスに紐付いている動作中のプロセスを確認し、Gitなどの環境を構築しました。言語は初期がRubyになっていたのでsystemdでPHPに切り替えました。言語を切り替えただけでスコアが500→1000に。
テーブルを確認し、必要そうな箇所にインデックスを貼って見たらなんとスコアが1000→2000に。
続けてフォロー一覧やフォロワー一覧ページの無駄に叩かれるクエリを最適化していきました。foreachで何度も叩いているクエリを結合して1回のクエリで済ませるようにしたり、count文にしたり。
このへんで約2時間。スコアは3000まであがりました。なんとこの時点でのトップを独走しており、2位以下は1000点に達していないような状況でした。
ここで余裕が出てきたので、Redisに載せ変えようと考えpeclをyum installしました。
するとなんとスコアが2500に!使用中のモジュールまで更新されたかなにかで以降スコアが下がったままになってしまいました。しかもうまくPHPにてRedisを導入できず、結局諦めミドルウェアまわりのチューニングにとりかかりました。
nginx, mysql, カーネルまわりのチューニングをしましたが、スコアは伸びず。今回のサービスは通信量が少ないため、ボトルネックはネットワークではなくクエリにあったためです。
と、ここでスコア4000を叩き出すエンジニアが登場。
結局最終的にはスコア2500でフィニッシュ。
最終結果
1位は@pe10:3000点くらい
2位はなんと、僕でした!
4000スコア出していた人は再起動後にFAILになり失格だったそうです。
惜しくも2位でしたが、2日目1位となり、amazonギフト券をいただきました!!!!
感想
ISUCON5に参加した方々が総じてスコアが高く、やはりアドバンテージがあったのだと思います。
言語切り換えやベンチマークの動かし方、チューニング対象の絞り方などは、ISUCONならではな感じがします。
スコアが高かったのもありますが、こういうイベントを楽しんで参加することができたことが嬉しかったです。
今後も本家ISUCONや何か面白そうなイベントには参加していきたいと思います。
エバンジェリスト、お疲れ様でした。