ISUCON12 に参加した

喫茶ten、124位らしい

ISUCON12にチーム「喫茶ten」として参加して、7958点を取った。感想やら反省やらをつらつらと書いていく。

チームメンバー

ten986

  • (練習/本番の)環境構築と、初動の準備担当、練習の呼びかけ担当

  • その後はアプリ触ったりペアプロ担当したり

asRagi

  • 主にアプリ担当

  • ISUCONチェックリストの作成をした。わりとなんでも知ってる

  • チームの指揮、方針決めなどもしていたと思う

kuromitz

  • 主にインフラ担当

  • サーバーが分割できるのはこの人のおかげ、時折点数を跳ね上げる

本番までにやったこと

  • 各自ISUCON本を読んだ

  • 2週間前の日曜に集まろうとする

    • 主にten986のみが参加する(?)

    • ここでten986がISUCON本とprivate-isuでISUCONの渡り歩き方を知る

  • 1週間前の日、月に集まる

    • 日:ISUCON10予選

      • asRagi, kuromitz は解いたことがあるため、細かい動きの確認が主

      • いい感じの点数が出た

    • 月:ISUCON11本戦

      • アプリ側の改善方法がなければサーバーを分けること、ベンチマーカーの気持ちになることを覚えた

本番

9:40 くらい

放送開始
全員起きたのでえらい

10:00 くらい

開始
ten986 がサーバーの準備をしている間に asRagi, kuromitz がマニュアルを読む、ten986 は聞き流す

10:30 くらい: 3000点程度

この辺でベンチマークが回る。3000点程度
ten986 がサーバーの準備を続け、asragi, kuromitz が改善できそうなところを探る

11:00 くらい

pt-quert-digest を見ると、全然 slow query が載ってないことに気づく
よく見ると、sqlite が使われている。は〜?

ところで alp を見る限りは「GET /api/player/competition/:competition_id/ranking」と「GET /api/player/player/:player_id」が重そうなので、asRagi と ten986 がそれぞれを見る

ところで主に asRagi が sqlite を MySQL にマイグレーションする方法を調べ始める

12:30 くらい: 3500点程度

kuromitz がDBサーバーの分割に成功して、3000点 -> 3500点 に
えらいぞ

13:00〜14:00 くらい

sqlite に苦戦

100個の.dbファイルがある中、1.dbだけ160万レコードある罠により、2.db〜100.dbもその程度の容量か?と考えたが、なんと2.db〜100.db合わせて1.dbくらいの容量だったりする

1.db をそのまま MySQL に流すと異様に時間がかかったため、途中でやめる。まあ160万レコードあるしなあ

ちなみに、1.db だけ MySQL に移行できたため、explain だけ MySQL で行い、index は sqlite の方で貼ることができた。1番のおもしろ状態だった

14:30〜15:00 くらい

このへんで「GET /api/player/player/:player_id」を見ていた ten986 が、各 (competition_id, player_id) の組で最大の row_num を持つものしか必要ないことを発見する

ten986 と asRagi が対応し、*.db の各ファイルで delete をかけることで、容量の圧縮に成功する
しかし、/initialize で *.db を MySQL に流そうとすると1分程度になり、30秒の制限を超えてしまい、このへんで MySQL への移行を断念する
(これは感想戦で分かったことだが、https://pypi.org/project/sqlite3-to-mysql/ を使っていただけなのが原因で、圧縮した上で dump を取れば普通に間に合うらしい、う〜んw)

/initialize が間に合わないものの、MySQL に移した状態のベンチマーク自体は取れていた。500点。500点!?!?!?!?!?!?!?
これも MySQL 移行を断念する要素となった

この辺までずっとsqliteに苦労していたので、実質ここからISUCONスタート。半ISUCONですね、うん

sqlite の駆逐に失敗したため、slow query の取得ができず、alp からエスパーコンテストを以降することになる

16:45 くらい: 8000点程度

ten986 が row_num 周りの変更に成功。この時点では点数は上がらなかったが、排他ロックをかける必要がないと判断し、削除。これで 3500 -> 8000

なお、排他ロックを適当に外したせいで、3回に1回ベンチマークが落ちるようになりました。草
1番伸びのいい変更だったこともあり、割り切ることにした

〜18:00

ten986 が「POST /api/organizer/competition/:competition_id/score」の改善、asRagi が「GET /api/admin/tenants/billing」の改善、kuromitz がアプリサーバーの分割や数値の調整をするも、間に合わなかったり、劇的な改善には至らなかったりする

7958点でフィニッシュ
最後駆け込みでいくつかサーバーをいじったり、ベンチマーカーがたまに落ちたりしていたが、失格にはならなかったためめでたい

感想

  • ISUCON本がありがたかった

    • private_isu をもとに実践形式で学べるのがいいですね

    • 去年よりやれることが格段に多くなったため、本戦やってて楽しかった

      • というか去年は練習環境構築に苦戦する以外のことやってなかった気がする(?)

  • 適当にチームを組んだものの、かなりバランスの取れたチームになった

    • たまたまサークルで余った3人だったはず

  • sqlite を移行するかどうかの判断が遅かったのが反省点か

    • 噂によれば、予選突破者でも sqlite と共存しつつ動いていたチームが結構いるらしい


この記事が気に入ったらサポートをしてみませんか?