カレーの恩返し

おいしいのでオススメ。

ISUCON8で予選敗退してきました

昨日、ISUCON8のオンライン予選があり予選敗退してきたのでその様子を報告します。

牛久大仏「う〜ん、顔採用w!」 というチーム名で筑波に編入した同期の@k5342, @chigichan24とISUCON8オンライン予選に参加してきました。

↓↓チームメンバーの記事はこちら↓↓

k5342.hatenablog.com

chigichan24.hatenablog.com

Rubyで参加しBest Scoreは5000点、最終Scoreは4000点と学生枠ボーダーには全然届かない点数でフィニッシュしました。

サーバはserver1: DB, server2: app1, server3: app2として利用し、
app1にベンチに来てもらい、ラウンドロビンでapp1とapp2にロードバランシングするといった構成になっていました。

スコアが目に見えて上がったのは複数台構成に変更したときくらいでした。

github.com

もちろんやってないこともたくさんあったけど、それなりに高得点者の歩いていた道を辿っていた気がするのでもう少し点数伸びてもよかったなぁというのが正直な感想です。


以下詳細です。

また、自分が関係するムーブだけ書いていきます(他のメンバーのムーブはブログに書いてくれるはず)

時刻 作業内容
前日
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)と一緒に反省会会場(焼肉)へ移動
f:id:euglena1215:20180917115632j:plain:w450
↑反省し終わった(肉を撮り忘れていた)
Wantedly社員の人が反省会費用を出してくれた(特にCTO)!ありがとうございます!
22:30 つくばへ帰り反省会2次会(ラーメン)へ移動
ISUCON第2ラウンド開始
23:45 色々とやってないことはあったのでおもむろにPRを作り始める
f:id:euglena1215:20180917115924p:plain:w500
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オフィスを会場として使わせてもらいました。

f:id:euglena1215:20180917123610j:plain

チームメンバーのうち1人は元インターン生、1人はWantedly全然関係ないという状況でしたが快諾してもらってありがとうございました!

f:id:euglena1215:20180917124431p:plain

所感

  • 初動が遅かった
    コードを書き始めたのが13:00ごろだった、このころには1万点弱に到達していたチームもちらほらいた気がする
  • 例年よりも作り込まれていてすごいと感じた
    フロントエンドはvue.jsで書かれていて時代の波を感じた
  • p debugよりもbinding.pryの方がやはり優秀
  • 帰ってからlocalで開発してみた結果、明らかにlocalで開発した方が実装速度が早いことが判明した(vim難しい)
  • 来年からは社会人として出るのでもっと力をつけていきたい