stefafafan の fa は3つです

"すてにゃん" こと id:stefafafan のブログです

ISUCON 12予選参加したけど最終スコア12171点で惨敗 #isucon

予選の結果は明日出て追試とかあるので失格チャンスもあるが、とりあえず最終スコアは12171だった。

isucon.net

2022/7/24 追記: 予選結果が出て追試は通ったようだったので、12171点で確定のようでしたが、予選は敗退しました。 ISUCON12 オンライン予選 全てのチームのスコア(参考値) : ISUCON公式Blog

最終スコアの様子
推移

やったこと

  • 10:17 初回ベンチ: 2658点
  • 11:16 チームメンバーがDocker剥がして計測ツールを入れた: 2696点
    • 点数は変わらないけどtopとかで様子がわかりやすくなった...と思ったらMySQLの他にSQLiteもあるが故にまだよくわからない
  • 11:19 Goのdb関連のパラメータと、再起動試験対策コード (DBをpingし続けるやつ) を入れておいた: 2793点
  • 11:32 SELECT player_id, MIN(created_at) AS min_created_at FROM visit_history WHERE tenant_id = ? AND competition_id = ? GROUP BY player_id 遅いので雑なINDEX追加: 2764点
    • EXPLAINのときにrowsが減った気がしたけどINDEXが雑すぎて効果がいまいち
  • IDの採番をDBのカラムでやればいいじゃんと一瞬みたものの、tenantのDBはSQLite側にあることを思い出して一旦手離した
    • 結局最後まで何もできずに終わってしまって勿体無い、冷静になると google/uuid とかを使えばよかった。
  • 14:26 competitionRankingHandler のN+1をチームメンバーが解消: 2952点
  • 14:52 playerHandler のN+1を地道に直してたのがやっとできた: 2653点
    • そもそもいまのボトルネックは mysqld とかでは?と冷静になってマージせずにおいた
      • 結局最後までマージしてなかったのでなんか勿体無い
  • 15:59 チームメンバーがplayer や competition テーブルを MySQL にしてくれた、この辺りで2台構成にもした: 3752点
  • 16:15 チームメンバーがplayer_score もMySQLにしてくれて SQLite なくなった: 3919
  • 16:25 player_score bulk insert
  • 17:20 頃 App 1台、DB 2台的な構成に: 4-5千点程度
  • 17:30 頃 MySQLのsystemdファイルをいじって --disable-log-bin 追加したり、mysqld.cnf にinnodb_buffer_pool系の値を設定したり: 10000点弱
  • 18時前 各種ログ無効化、nginx.conf適当にkeepaliveっぽい設定入れたり、GoのMaxOpenConnsいじったり: 12171

16時台ではあきらかにやばくて、これは確実に予選敗退という感じだったので、再起動試験も無視して進めた(昨日の作戦会議では16時になったら再起動試験やりましょうと話してたけどまさかこんなことになるとは…‥)。アプリケーション側の改善ほとんどやっていないチームみたいになってしまった。SQLite剥がしは結構チームメンバーに任せてたので、アプリケーションの改善が全然できなかったのは自分の力量不足みたいな感じで悲しい。でも、なんだかんだ1万超えられたのはよかった。一方で、いろいろと素振りで練習していたことは8割くらい活かせられなかったのでつらかった。チームのScrapboxに静的ファイルキャッシュ情報とか、カーネルチューニング情報とか、いろいろまとめてたけど一切使わなかった。mysqlやnginxのconfig設定に詳しくなったのだけよかった。ISUCON 12予選の AMI がもしまた用意されたらそのうち続きをやりたい。

おつかれさまでした。