monolog

monora log #=> ものろーぐ

ISUCON10 予選の参加ログ (チーム: 再起動非対応, 最終スコア1997, 40位ぐらい)

未分類

こんばんは、kyontanです。

前々回再起動試験で落ちたのでチーム「再起動非対応」で参加しました。チーム名は前日まで考えていましたが変えるのを忘れました。
言語はGo, ベストスコアは2101, 最終スコアは1997で、多分40位ぐらいでした。悔しい〜〜

本チーム「再起動非対応」は同期3人 (自分 @kyontan, @hogashi, @h-otter) です。このメンバーで4回目の参加です。学生はうち2人なので、一般チームです。

今回は直前まで対策が無で、前々日ぐらいに「そろそろ予選ですね」みたいなことを言ったら「前日は酒を飲む予定があるんだった」みたいな感じになり、そういえば僕も酒を飲む予定があったわね……という感じでした。

当日の様子は @hogashi がかなりいい感じに時系列でまとめてくれていた、ので読みながら書いています。特に自分がやっていないことも自分がやったかのように書いてあります。そんなことはない。

0:00: そろそろやるかとなり、自宅のLinuxサーバにISUCON9 の予選問題を展開して、長らく使っていなかったMySQL筋やnginx筋,Go筋などのストレッチをしました。ここまでプログラミングってなんだっけ?状態

2:00: この段階で重大な伏線を仕掛けており、MySQL 8.x での追加機能に触れています。

本番に思い出されることはなかった降順インデックス

ついでに、勝手に MySQL 8.x が来ると確信したので、クエリキャッシュ系のコンフィグをテンプレからコメントアウトします。伏線は張れるだけ張る。

8:00: 目覚ましを掛け、おぼろげな意識の中、開始時間が伸びたことを知り二度寝。この時点で優勝を確信する (遅い時間ほど頭が回るため)

11:00: 起きてzoomを繋ぐ。 @hogashi は前回競技中にやっていた洗濯を終わらせる。

12:20: 開始。サーバ一覧が出ないね〜って言いながら謎のgistを見たらIPが乗っていたのでつなぎにいく。ベンチマークがしばらく回せなかったので、とりあえずMySQL 5.7だね〜とか言ったり、コードを眺めたりアプリを触ったりする。
なぞって検索を見て、そういえば最近お仕事でGISやったな〜 SPATIAL INDEXで一発優勝ってマジ? などと、一人で優勝を確信する(大嘘)
featureの検索高速化したいね〜などと議論しつつ、各featureをbitに対応させて数値検索とかしても速くならんだろうし、いわゆるN:Nのタグ付けを実装するパターンでやるかなーみたいな会話をする。

なお、お題の推測は外す。

13:00: 初期スコア 471 を確認。MySQL のスローログ入れたり基本的なチューニングとか nginx の静的ファイルキャッシュとかする。なおクエリキャッシュはコメントアウトされていたのでそのまま忘れ去った。

13:30ごろ: Visual Studio Code の Remote Development + Live Sharing のセットアップ中に1台目からsshの応答が返ってこなくなる。ディスクが遅いのは知っていたが、まじか〜となり、3台目に作業環境を移す。サポートに再起動のお願いをする。 (ちなみに数十分後にサーバから応答が返ってきた)

13:55: なぞって検索を MySQL GIS 使って高速化やるぞ、となる。GEOMETRY型のカラムを足していい感じにやる。初期実装の POINT(x, y) における緯度経度のタプルの順序が、一般的なGISにおけるそれと逆でン゛ッとなる。

14:12: 椅子を回転してドアに入るか試したりしていた。入ったらしい (詳細不明)

15:27: nginx で bot ブロックをする。結局これがどのくらい効いているのかは不明だった。

15:39: GEOMETRY の改修が終わる。スコアは 829

16:13: とりあえずDBとappを分けて2台構成に。インデックスとかもいい感じにやる (降順インデックスなどは気付いていない)。スコアは 1345
この時点で2位に躍り出る。記念にスクショ

16:35: トップページに表示する最安の物件/イス20件をオンメモリキャッシュするが大して変わらず。

16:40ごろ: 3台目で Visual Code Remote Development + Live Sharing したらまた応答が返ってこなくなり2度目の解散。(18:00ごろに返ってきたらしい) 2台目に移る。ついでにポータルも繋がらなくなる。
「『計測するな、推測せよ』ってかw」

17:00: @h-otter がいい感じに chair と estate の feature 検索の改善を書き始める。寝不足らしく脳死脳死連呼しながらもテストコードを書きながら直してて偉い。これがTDDってやつね。
この実装はオンメモリ実装とDBのクエリでやる実装の2種類を考えていて、僕はDBを使った実装を書いていたがinitializeがかなり遅くなってしまった && @h-otter のオンメモリ実装が先に終わったこと (かつそちらの方が早くなりそう) もあり、そちらを採用。

19:22: ↑の実装が終わる。スコア654 。本当に?ってなってインデックス効いてるか見たら外れてた。入れる。スコア 2078
たしかこのあたりで15位ぐらい。勝ったなとか言う (勝ってません)

19:30: まだ色々できることはあるけど30分ぐらいでバグらずにできる自信はないね〜となり、細かい変更をちょいちょい入れる。 nginx の client_body_buffer_size を大きくするとか。POST系のペイロードがでかいのは気付いていたが、中身が何なのかわかっていなかった。あきらかに1件の大きさじゃないよな……とは思っていたが…… (複数件同時に投稿されていたことは終了後に知る)

20:00: ベンチを延々叩いて(不)安定性を確認する。なんか検索を改善した部分が若干バグっているっぽくてランダムで落ちる。原因はわからなかったので特にコードは修正せず。不安要素は最小化しましょうということで、とりあえずスコアに貢献してなかったトップページの安い順トップ20のキャッシュはrevert。POST系のペイロードがでかいのはこのあたりで気になっていたが、1件ではなく複数件を追加するリクエストだったことには終わるまで気付かなかった。

20:30: チーム名を思い出す。再起動試験。再起動して実行したらアプリが落ちてて焦る。DBが先に上がってないと落ちることを思い出す。systemdの気持ちになって無限再起動するように設定。OK。

20:45: 適当にベンチを何回か叩く。1997が出る。「どうする?」「ん〜〜〜」「でも最後ってみんなベンチ叩いてるから(CPUとかネットワークの利用率が上がって)スコア落ちたりするよね〜」「じゃあこれで終わりで」最後に再起動する。initialize が通ることを確認。ここでタイマーストップ

20:50: 乾杯

23:00: discordを見つつ、結果出ないね〜と言いつつ、名取さなの fall guys 配信のアーカイブを見る。ISUCONの運営インタビュー?みたいなやつの記事を見たら、とある先輩の顔写真がめちゃくちゃ高解像度で大爆笑する。毛穴までクッキリ。exiftoolを叩くも特に何も残っていない。

23:30ごろ: 生放送で順位が出る。おらんやんけ!!!!!!! 解散

26:00ごろ: 入眠

最終的なスコアを見た感じ、あと100点ちょいって感じだったので、あと何か1つ出来ていれば本選に行けたでしょう。検索改善はまだ手が残っていたし、estateとchairのDB分けられたね〜とか終わった直後に気付いて「『アッ』」ってなったし、MySQL 8.0 にするだけで SPATIAL INDEX は速くなった可能性があるし、なんならクエリキャッシュだけでも良かったかもしれない。色々できた気がする。

ところで「まだ何かできそう」とアイデアが思いつくのは色々と課題を分析できている証拠だと思っていて、それをちゃんと実装までできるスキルもあるチームメイトはやはり優秀だと思う。今回は特に分析→仮説→改善→振り返りのサイクルをしっかり回せたので、今後にも活きることでしょう。
改善できるネタが思いつくということは、自分たちのチームが勝っていた世界線もあるということです。あとは前日の睡眠をしっかり取ればちゃんと勝てるはず。

来年はインターネットや書記や洗濯が得意な社会人と、インフラとチーム開発とアニメ鑑賞が得意な社会人と、睡眠が得意な社会人(笑)の3人で参加したいです。開始時間は12時だと助かります。ありがとうございました。

Comments are closed.