ISUCON7 予選通過した

ISUCON7id:kazeburo さんと id:gfx さんと、チーム「スギャブロエックス」で出場して、2日目の上位3チーム枠の2位で予選通過しました。

isucon.net

f:id:sugyan:20171022204129j:plain

スコアの遷移は以下の通り、最終スコアは 522,461。

時刻 スコア
2017-10-22T13:06:44 6012
2017-10-22T13:16:24 5108
2017-10-22T13:35:01 4721
2017-10-22T13:49:24 6870
2017-10-22T14:36:24 4951
2017-10-22T14:41:01 6749
2017-10-22T15:03:44 6164
2017-10-22T15:24:50 15095
2017-10-22T15:29:00 20526
2017-10-22T15:37:00 17957
2017-10-22T15:46:22 30512
2017-10-22T15:50:50 31042
2017-10-22T16:21:24 28323
2017-10-22T16:57:17 17656
2017-10-22T16:58:22 15725
2017-10-22T17:00:50 21895
2017-10-22T17:02:13 23369
2017-10-22T17:07:48 19385
2017-10-22T17:11:06 26365
2017-10-22T17:24:37 51942
2017-10-22T17:36:39 36799
2017-10-22T17:40:00 32550
2017-10-22T17:42:49 85787
2017-10-22T17:52:07 56550
2017-10-22T18:04:06 114636
2017-10-22T18:06:07 144735
2017-10-22T18:16:51 115281
2017-10-22T18:22:16 139258
2017-10-22T18:31:50 108422
2017-10-22T18:40:40 110545
2017-10-22T18:46:12 207937
2017-10-22T18:52:31 224172
2017-10-22T18:57:17 294244
2017-10-22T19:02:48 185747
2017-10-22T19:04:11 197431
2017-10-22T19:13:12 211655
2017-10-22T19:17:02 180887
2017-10-22T19:19:31 324890
2017-10-22T19:21:20 365210
2017-10-22T19:22:34 257398
2017-10-22T19:29:15 313264
2017-10-22T19:34:51 268841
2017-10-22T19:37:42 506162
2017-10-22T19:39:13 465960
2017-10-22T19:43:36 398467
2017-10-22T19:45:31 360072
2017-10-22T19:46:58 312146
2017-10-22T19:48:54 506943
2017-10-22T19:54:15 373185
2017-10-22T20:00:29 255289
2017-10-22T20:09:05 349379
2017-10-22T20:10:42 223452
2017-10-22T20:20:09 304453
2017-10-22T20:22:14 213811
2017-10-22T20:23:30 195622
2017-10-22T20:25:16 235779
2017-10-22T20:27:38 309148
2017-10-22T20:32:19 393837
2017-10-22T20:33:33 212309
2017-10-22T20:35:04 405354
2017-10-22T20:36:55 236184
2017-10-22T20:38:30 264824
2017-10-22T20:40:06 522461

チームで使ったコードの履歴はこちら。

GitHub - gfx/isucon7-qualify: SugyaburoX repo for ISUCON7 (2017) qualify

前日まで

チームは決めて Slack上でやりとりはしていたものの、直接顔を合わせての打ち合わせ的なものは1度もせず。 まぁ開始時間が遅くなっていたおかげで早めに集まって始まるまでの時間があったので良かった。

言語はどれを使おうか、ってのはまぁ悩んで。 元々みんなPerl界隈の人だったはずだけど最近は… って感じで 僕も自分が一体どの言語が得意なのか分からない状態だったので gfxに任せて Node.js で行くことに。

当日

kazeburoさんのMercari社さんで場所と昼食を提供していただけることになったので(ありがとうございました!!!)、六本木に集合。

最初はだいたい決めてた通りに役割分担する感じで kazeburoさんがサーバ周りもろもろセッティングして gfxがコードを読んでアプリケーションを把握して 僕がローカルでアプリケーション動かすのを試してみたり

やったこ

お題はチャットアプリケーション

まずはとにかくユーザのアイコン画像がDBに入っていて毎回アプリケーションから返してるのはないよね、ってことでWebDAVで一箇所に静的ファイルとして保存して返すようにしよう、と。 初期データのものをWebDAVにツッコむだけのスクリプトを書こうとしたのだけど、Nodeの非同期httpリクエストを扱いながら繰り返し処理をする、ていうのが上手く書けず… 結局2人に見てもらって引き取ってもらう という役立たずっぷり orz

そのへんとか N+1的なクエリをgfxが直したり でスコアは上がったものの 他のチームは桁違いに高い数字を出しており… どうしたらそんな点数でるの?? て感じで17時半くらいの時点では敗色濃厚な雰囲気。。

kazeburoさんが1台あたりの帯域を使い切っていることに気付いてベンチマーカの向き先を増やしたりCache-Controlヘッダを上手いことやったりして一気に2〜3万から7〜8万にアップ。 ここからだんだんまたアプリケーションやDBのボトルネックが見えるようになってきたので再び遅いクエリを解消していくなどの作業。

各チャンネルの未読数を全チャンネルに対するCOUNTクエリ発行してるのを解消しよう、と既読数テーブルを作って 全メッセージ数 - 既読数 で未読数を出すように変更。22万くらいから29万くらいに上がった、唯一バリューが出せたところ

あとは全メッセージ数もchannelテーブルで管理するようにとか色々変更を入れていったらだいたい30万以上は出るようになったのだけど とにかくベンチマークのブレが大きくてコード変えてなくても実行するたびにスコアが10万点くらい上下したりして ボトルネックの発見もその解消の検証もしづらい。 まず効果がありそう、なところだけやって、最後の数十分は何度も試して高いスコアが出るまで祈って繰り返す、という感じだった。 20:40で良いスコアが出たのでそこでストップ。

反省

Node.jsの非同期処理まわりが書き慣れてなさすぎてロクにコードを書けなくて足を引っ張ってしまった。 ホントにkazeburoさんとgfxのおかげで通過できました!!!という感じだったので 本選ではもっと役に立てるよう頑張りたいと思います。


出題・準備と、運営の皆様 とっても大変だったと思いますがありがとうございました! また来月よろしくお願いします!!!!!