ISUCON4 予選お疲れさまでした! 予選問題の Ruby 初期実装などを担当した @sora_h です。
予選はたのしんでいただけましたでしょうか? 本記事では、ざっくりとそこそこのスコアを出す解き方を紹介しようと思います。
※@rosylillyによる、高得点を出すことを重点に置いたピーキーな解答例はこちらです
前提
- 一人でやる
- 一応8時間経過時点でスコアをとる
- ただし出題者であるので問題の把握などの時間は短縮されていることに注意。
- Ruby の実装を利用する
- ある程度、現実味のあるチューニングが主
- ベンチマーカーの実装を利用したりしない
また、この記事で出来た実装は GitHub に掲載しています: https://github.com/sorah/isucon4-qualifier-sorah
初期スコア
とりあえず立ち上げて動かした時のスコアは success:6030 fail:0 score:1303 でした (workload=1)
チューニング
ここからチューニングしていきます。
失敗数のカウンタを Redis にのせかえる (2 時間経過)
問題を読むとログを残す必要は一切ない事がわかるので、とりあえず mysql でログを取るのをとめて、Redis をカウンターとして利用するように変更します。
ただし、MySQL でも適切な index を張ればスコアが出せます。この辺は好みだと思われます。
-
isu4:user:<id>,isu4:ip:<ip>をカウンタとして連続失敗数を記録 (INCR) -
isu4:last:<id>,isu4:nextlast:<id>を最終ログイン記録に利用
スコアはこの時点で "success:29430 fail:0 score:6357" (workload=1)
これはあまりスコアに影響はなかったのですが、少し後で users テーブルも redis にのせることにより、
完全に mysql をとりのぞいています。

