今年も Ryoga.exe, Sor4chi と一緒に Maxif. として ISUCON14 に参戦しました!
去年の記事 には ISUCON と ICPC かぶせないで!と書いたので実際にかぶらず良かった (が JOI 2 次...)
この記事の 7 割ほどは競技中にメモとして進捗を書いていただけのやつなので内容薄いかもです。あらかじめごめんなさいしておきます
なんか思い出したら追記するかもです。
練習
何回かやりました。
今年は isucon-maxif Organization を作ってやりました。
Maximum 内ではあと 2 チーム、 Maximum-Y.N.K.S と Maxipus が参戦。
遂にISUCON14が行われます。 弊サークルからは以下の3チーム出場します!! •Maxif. (a01sa01to, Ryoga.exe, sor4chi) •Maximum-Y.N.K.S (2xsei, kabos, kAsA02) •Maxipus (yukikamome316, NakamuraItsuk, batora) 全力を尽せるよう応援しています!!
当日
自分の担当したところしか書きません。ほかの人視点はこっち。
- Sor4chi: ISUCON14に参加してきました | Monica's Portfolio
- Ryoga.exe: 未
実際に使った作業用リポジトリ: isucon-maxif/isucon14
起床成功
がんばるぞい!
問題
自動運転かぁ 座標の計算とか出てきそう
招待キャンペーンとかめんどくさそう
なんかニュース画面に typo あったなぁ
競技
時系列順です。
10:00 - index はり
セットアップは Sor4chi に任せて、まずはマニュアルを読んでいく。
ざっくりコードとマニュアルは読んだ。
まずボトルネックになりそうな middlewares を読んでいく。
owners, users には access_token に UNIQUE ついてるのに chairs にはついてないっぽい。
owner_handlers をちょっと読んでみた。
ちょっと index を張ってみる。
そこで pprotein が使えるようになったので、 slowlog を見てみると、読みは大体当たってるっぽい。
ここからは slowlog を参考に index を張るようにしていく。
slowlog の count >= 1000 だったのをいったん index はった。
10:45 - 2921 点。 14 位。 学生 1 位。
https://github.com/isucon-maxif/isucon14/pull/4
ほかのところも index を見ていく。
とりあえずめちゃくちゃ遅そうなところに index をはった。
11:00 - 3004 点。
https://github.com/isucon-maxif/isucon14/pull/12
11:05 - internal の matching 改善
とりあえず index はこんなんでいいか ほかのところを見ていく。
Ryoga.exe が Issue にいろいろあげてくれていたのでそこを見る。
Ryoga.exe & Sor4chi によって 4000 点を超えた。
alp の設定がまだされていなかったので設定。
11:23 - なんかマッチング回り改善できない?ということでアルゴリズムを見てみると、ランダムに選んでマッチしたらマッチみたいなことをしている
さすがに近いところから取ってきたほうがいいので、アルゴ力を生かさずともイス数・ユーザー数が 1000 もいかないので で試した。
12:08 - なんか実装してる間に 6630 点行ってた。 9 位の学生 1 位再び。
retry_after_ms の設定を 30ms から更新してくれたっぽい。
何回ベンチ回してみても failed になってしまう、長時間マッチングされてないとのこと。
デバッグでマッチ結果を見てみると、どんどん待ち状態になってしまってるっぽい。
見てみると、一度使ったことのあるイスは使えない扱いしちゃっていた。ばか。
直したところ、なんか判定がおかしい。
うーんうまくいかないので初期実装のまま n+1 になっちゃうけど試してみるとうまくいった。
13:19 - 13073 点。 5 位。学生 1 位。うおうお
https://github.com/isucon-maxif/isucon14/pull/19
13:24 - 13:37: ごはん
13:43 - サーバー分割
そろそろサーバー分割の準備でもするか
どう分割するか悩んだが
- s1: App
- s2: DB
- s3: Matching 処理
としてみることにした。
まあいつも通り s2 で DB の bind-address を更新する。
でユーザーを一応追加しておく。
ついでに index もいくつか追加。
どうせ isuride-matcher は s2 で使わんやろってことで systemctl disable
した。
s3 のほうも /etc/hosts
のサーバーアドレスを s1 に向けておいた。
うーんうまくいかない
サーバー分割をしても DB connection が 10 とかじゃないと負荷やばすぎてベンチ落ちる... いったん保留
15:20 - カラムを増やす
イスの現在地を取得したいなぁということで、 chairs
のテーブルに現在の座標を追加することにした。
15:55 - 容量がない!?
なんかベンチが回らない!ということになって、いろいろ試してみると s1 の容量がないらしい。
そんなことある?
df
とか du
とかいろいろ触ってみると、 pprotein のファイルが数 GB も食ってたので削除。
slowlog もめっちゃ食ってた。
16:05 - カラムを増やす 2
そんなこんなで実装に戻ってきた。
ベンチが回るようになったけど整合性チェック通らん。
nullable にしてなかった + initialize のことを考えてなかった。
しかも SQL の文法も普通にミスってた。反省。
そこまで上がらなかったがいったん merge。
低評価が増えていたせいだと思うのでうーむ
https://github.com/isucon-maxif/isucon14/pull/30
16:41 - マッチングの改善
こまった 移動距離も考えることにする
とりあえずサーバー分割するときに困ったのでいったん使わないファイルを消した PR を merge しておく。
https://github.com/isucon-maxif/isucon14/pull/34
マッチングは移動距離長い人から順番に考えるとよさそう?
フローとかやると最適解でそうだな~とか思ったが AtCoder Library for Golang に実装がなかったので諦め。
#isucon マッチングの部分、フローすればいいんじゃね?になっていたが ACL for Go がなくてあきらめた(?)
うーいろいろ試してみたが全然上がらず。
16000 くらい。
https://github.com/isucon-maxif/isucon14/pull/36
17:45 - ログ閉じとか再起動試験とか
ログ閉じとか秘伝のタレ注入とかをしてもらった。
再起動試験も一応やることにした。
再起動して環境チェックコマンド打っても特に問題なさそう、よかった。
結果
企業賞、 LINE ヤフーさんの「また会いま賞」 (全体 30 位) 獲得ということで 30 位確定です!ありがとうございました!
最後の秘伝のタレがなかったら入賞してなかった、 Sor4chi に感謝!
...あれ?なんか順位発表 29 位って書いてあるんですが...
まあ順位が上がるに越したことはないので、よかったです!
🤔🤔🤔 とおもったら Admin から連絡が
また会いま賞 by LINEヤフーの訂正について
先ほど放送内では、Maxif.チームとお伝えしましたが、正しい30位は黒酢唐揚げサン丼チームとなります(Maxif.チームは29位)。
訂正してお詫びいたします。
なお、また会いま賞の副賞、LINEヤフーグッズ詰め合わせは、両チームに進呈いたします。
賞品をもらえることになりました! なんかありがとうございます! (ちょっと申し訳なさが)
ということで、全体 29 位・学生チーム 4 位 (たぶん) で、「また会いま賞」もいただけることになりました!
うれしい~! お疲れさまでした! 🎉
感想
サーバー分割できなかったの悔しい~~~
Maximum 内で感想会をしていると、 Y.N.K.S チームは DB connection を 200 くらいにしたといっていて横転 なんでそこまでいけるんだ
ISUCON 競技 Discord サーバーでもいろんな人が感想を投げ合っていて、いろいろ勉強になった
Admin の とーふとふさん が POST /api/chair/coordinate
を高速化するとすべてが高速になる (超絶適当意訳) とかおっしゃっていてこれまた横転
うーつらい 🫠
しかもマッチングも同じ町内だけで完結できればよかったと知って泣きました
ちゃんとマニュアルを読んでいれば...
全体的にもっと時間があればできたかもなぁといった感じがする、悔しい~~~~~~~~~~ 😭
来年こそは! と言いたいところだけど Sor4chi が卒業 + 就職で学生枠じゃなくなっちゃうので来年のチーム編成はどうなることやら
来年も (チームは変わるかもだけど) 参加します!!!
TODO: 賞品が来たら載せる