ISUCON8で予選敗退してきました
昨日、ISUCON8のオンライン予選があり予選敗退してきたのでその様子を報告します。
牛久大仏「う〜ん、顔採用w!」 というチーム名で筑波に編入した同期の@k5342, @chigichan24とISUCON8オンライン予選に参加してきました。
↓↓チームメンバーの記事はこちら↓↓
Rubyで参加しBest Scoreは5000点、最終Scoreは4000点と学生枠ボーダーには全然届かない点数でフィニッシュしました。
サーバはserver1: DB, server2: app1, server3: app2として利用し、
app1にベンチに来てもらい、ラウンドロビンでapp1とapp2にロードバランシングするといった構成になっていました。
スコアが目に見えて上がったのは複数台構成に変更したときくらいでした。
もちろんやってないこともたくさんあったけど、それなりに高得点者の歩いていた道を辿っていた気がするのでもう少し点数伸びてもよかったなぁというのが正直な感想です。
N+1潰したし,静的ファイルのキャッシュはしたし,複数台構成にして負荷分散したし,CSVも微妙にメモリに乗らないように軽くしたが....だめだった.
— プリキュア (@chigichan24) September 16, 2018
以下詳細です。
また、自分が関係するムーブだけ書いていきます(他のメンバーのムーブはブログに書いてくれるはず)
時刻 | 作業内容 |
---|---|
前日 | |
16:00 | Redisの使い方をブログにまとめる→ これ |
22:00 | 1台構成→複数台構成時に変えたときに起こりうる問題を色々考える 今まで1台構成でばかり解いていたので色々考えることがあることが分かって、色々調べた |
当日 | |
8:00 | |
10:05 | DBのschemaを確認する |
10:30 | 自分のポートでwebサーバを立ち上げようとするが失敗する、ここで時間を多少消費する(firewalld周り) |
11:30 | reservationsのreserved_atにindexを貼ってみる |
11:45 | kataribe, myprofierを入れる(nginxに置き換え作業が発生していたため待ち時間が発生する) |
←DBめちゃ重との連絡を受けたのでN+1を潰していくことにした | |
15:00 | get_eventsから呼ばれてるget_eventのみ修正しN*N+1をN+1に改善した #6 サクッと書いたクエリを「ほんまに合っとんかこれ?」と3人で悩む時間が発生していた(合っていた)。ここでかなりのタイムロスをした感がある |
15:20 | get_eventsのtransaction要らなくね?となったので外した #7 |
16:30 | get_eventをN+1→1にした #8 クエリ自体は1になったけど処理方法がよくなかった(Array#selectでぐるぐる回しまくっていた) |
17:00 | 開発に使っていたサーバからの移動を命じられ、いそいそと移動する |
17:15 | app serverのメモリがやべえという連絡を受け、メモリを節約できそうな場所を探すがよくわからん(残り1時間を切っていたのでget_eventを複数回呼んでいるところの修正は諦めた) |
17:30 | メモリ使用を減らすためにとりあえずSELECT *を消した、が終了直前だったのでマージは見送られた #10 |
17:45 | app serverの再起動確認を行った&ベンチにenqueueされる様子を眺めていた |
17:55 | やることがなくなったので反省会開始
|
ISUCON終了 | |
18:30 | 同じ場所でISUCONに参加していたluvtechno(カニオムライス), qnighy(カニオムライス), Altech(カニオムライス), gedorinku(winjisucon)と一緒に反省会会場(焼肉)へ移動 ↑反省し終わった(肉を撮り忘れていた) Wantedly社員の人が反省会費用を出してくれた(特にCTO)!ありがとうございます! |
22:30 | つくばへ帰り反省会2次会(ラーメン)へ移動 |
ISUCON第2ラウンド開始 | |
23:45 | 色々とやってないことはあったのでおもむろにPRを作り始める |
24:00 | get_eventsでpublicなイベントだけ欲しい場合も一度全てのイベントを取得してからフィルタリングしていたのでSQLで行うように変更 #11 |
24:30 | get_eventの修正後の処理がよくなかったので最適化した #12 |
25:20 | get_eventをループ内で複数回呼んでるところ用にget_events_from_idsを作った、これが動けばN+1は全滅のはず #13 |
26:00 | メモリが足りないとのことだったので不必要な変数の取り回しをなくした #14 |
おまけ
また、今回は自分のインターン先のWantedlyオフィスを会場として使わせてもらいました。
チームメンバーのうち1人は元インターン生、1人はWantedly全然関係ないという状況でしたが快諾してもらってありがとうございました!
所感
- 初動が遅かった
コードを書き始めたのが13:00ごろだった、このころには1万点弱に到達していたチームもちらほらいた気がする - 例年よりも作り込まれていてすごいと感じた
フロントエンドはvue.jsで書かれていて時代の波を感じた p
debugよりもbinding.pry
の方がやはり優秀- 帰ってからlocalで開発してみた結果、明らかにlocalで開発した方が実装速度が早いことが判明した(vim難しい)
- 来年からは社会人として出るのでもっと力をつけていきたい