2015年9月28日月曜日

#ISUCON 5に参加して普通に予選敗退しましたが楽しかったです

チーム名「恵比寿ローラーコラボ」でISUCON5に参加しました。

ISUCONは全員が初めてで、GCPも全員が初めてだったので、はっきり言ってどうなるかわからない、すごく情けない結果で終わるのではないか、ということで、記念受験のつもりで気楽にいこう、という意識と、お昼は半額のドミノピザにしようという2つのコンセンサスだけ得た上で臨みました。

結果としてはベストスコア 8387 、最終スコア 7806でベスト20入れず…でした。
しかしもともと1000未満くらいのスコアで終わってしまうのではと思っていたので、打ち上げでHUBで飲んでいた時には、「思ったよりスコア取れてよかったよね」とか、「次はランク20以内とかに入りたいね」なんていうかなり前向きな言葉が出てきて気持ち良くビールをいただくことができました。

こんな楽しいイベントを企画していただき、実装していただいた運営者の皆様には深くお礼申し上げます。とても楽しかったし、勉強になりました。ありがとうございました。

スコア遷移


score 状況
546 初期状態で起動されてるrubyのアプリがベンチマークに通る
702 Goのアプリに変えてベンチマーク
983 ググりながらDBにインデックスを貼る。この時点ではみなさん初回ベンチマーク通過に苦戦しておりなんと暫定4位!W
1042 MySQLにバッファプールの設定などを追加して再起動。この時点で12時すぎ。みんなでドミノピザを食べる。このときたしがギリギリ19位。
1030 プログラム方面の解析でまだ具体的な変更を出せないのでMySQL周りを引き続きいじるも結果でず
1008 同上。
1041 同上。
1031 同上。この辺りから(たいしてスキルもないのに)ミドルのチューニングじゃもう稼げないかななどと思い始める。
0 インデックス貼り直し中にベンチマークしてしまいCPUが耐えられずfail
7 アプリの改修がうまくいっておらずfail
7 思いついた案がことごとくfail
7 つらい
1114 そんなさなかNginxの設定を見直してハイスコア更新。希望の光がほんのり戻る。15時くらい。このころはもう20位が7000とか取ってて自分たちはTOP20からあっさり消え失せる。
1064 SQLがネックなはずという方向性でアプリを修正するも
1070 うまく結果が出ず
1046 迷走
1378 SQLのSELECT分で * を指定しているところは個別にカラムを指定したほうがいいのでは?という発想からSQLを修正する。
1917 relationsテーブルに関するSQLでORを使っているところがあったが冗長だからいらなくね?という発想からSQLを修正する。この時点でラスト1時間くらい。
3373 引き続きrelations関連のSQLのORを消す
8387 LIMIT 1000してるところは1000行もいらなくね?& isFriend関数通す必要なくね?という発想からSQLとGoをちょこっと修正したら効果絶大。
7806 最後にベンチしたらなんか下がった。


よかったこと


  • apt-getでアップデートして死んだりとかしてるチームもいたので、そういうことはやらずに、最後まで最初のインスタンスでトラブルなくやれたこと
  • 午前中に例のタマキさんバグが出たけど、割とすぐ「ベンチマークをやり直せば回避できるバグだ」ということを発見し、チームに対処不要の通達ができたこと
  • すごく遅くなったけどスロークエリのログを出して一番時間がかかっているSQLを特定できたこと(インデックス追加した後だったのでどれも1秒未満だったけど…)
  • ぐぐりながらだけどNginxやMySQLの設定を追加してスコアアップに貢献できたこと。
  • Nginxのgzip圧縮を試して、それがベンチマークアプリ的にダメだとわかって、切り戻してfail回避して作業継続できたこと。
  • Githubのプライベートリポジトリでソースコード管理して慎重に改善できた


改善点


  • スロークエリを特定してアプリ担当にフィードバックするまでを午前中にできたらもっと違ってた。ソッコーでやるべきだった。
  • 3人中Goがわかる人が一人だけだった。みんなのGo基礎力が高かったらもっと違ってたかも
  • Redisの経験がなくてRDSのデータ載せ替えとか全然やれなかった。練習しとくべきだった
  • GCPも全然練習できなかった。
  • DBのAnalyzeとかExplainとか全然できなかった
  • GCPのインスタンスとローカルでファイルをやりとりする、デプロイするところが思ったより苦戦した。Ansibleでサクッと自前ユーザを追加したりすればよかった。

私はインフラ担当として参加しましたが、わたしのインフラスキルが総じて低く、プログラマがより成果を出せる開発基盤を提供することがうまくできなかったことがやっぱりチームのネックの一員だったのかなと思います。
ただ、実際に時間内でのパフォーマンスチューニングを行ってみたり、他の好スコアのチームのブログなどを読んで、「もっとこうすればよかったんだ!」というところが所々見えてきたような気がするので、前向きにスキルアップに臨みたいというモチベーションが上がっています。
そういう点も含めて、ISUCONに出て非常によかったと思います。
改めて、運営のみなさん、非常に有意義なイベントをご提供いただきまして、ありがとうございました!