ISUCON11で優勝しました

勝った!!引退!!!

取り乱しました。

ずっと参加してきているWebアプリケーションパフォーマンスチューニングコンテスト ISUCON、ISUCON11本選にチーム「fujiwara組」で参加して、優勝しました。

ISUCON11 まとめ : ISUCON公式Blog

fujiwara組は初回のISUCONから参加している老舗チームで、自分(fujiwara)以外のメンバーは都度入れ替わっているのですが、今回はISUCON10の時と同様に会社(面白法人カヤック)の同僚である acidlemon と macopy とのチームです。

f:id:sfujiwara:20210921113931p:plain
チーム紹介スライド

過去に ISUCON1, 2, 5 で優勝しているので、6年ぶり4度目の優勝になりました。もう引退していいよね!(というか941さんに出禁って言われた気がする…)

やったこと

リポジトリはこちらです。

github.com

アプリケーションの変更は PR になっているので、それを順に見ると分かりやすいかと思います。 Pull requests · fujiwara/isucon11-f · GitHub

方針としては以下で、結果的には全員のやることがなくなってしまうことがなく、最後まで手を打ち続けられたのが勝因かなと思います。

  • fujiwara がインフラまわりの初期設定とチューニング、モニタリング、複数台構成を組むなどの足回りを整備
  • その間に acidlemon, macopy が大きめのアプリケーション改造に取りかかる
    • GetGrades の SingleFlight 化
    • JOIN はずし
    • 既読管理の Redis 化
  • fujiwara が細かいコードの改善を片付けて露払いする
    • zip生成での外部コマンド呼び出しを archive/zip 化
    • 1行だけ DB を引くような部分をオンメモリキャッシュ化 (メモリになければDBを見てメモリ(sync.Map)に載せる
    • 外部キーを全部やめる
    • echo(フレームワーク) の JSONSerializer を自作して goccy/go-json
    • 参照だけのエンドポイントで無駄にトランザクションを張っていたのをやめる
  • 大きめの改善を merge して伸ばしていく

fujiwara組が負けるときのパターンは、インフラ担当の自分がやることがなくなってしまって手が空いてしまうことが多いのですが、今回は3人がフル回転できてよかったですね。

個人的ハイライトは、archive/zip 化を決意して、10分で一発実装、ベンチ通過できたところでしょうか。AWS Lamba デプロイツールである lambroll を実装したときに Go での zip 生成は経験があったので、それをみながらスッとできました。いろんなコードを書いてみるものですね。

archive/zipにする by fujiwara · Pull Request #5 · fujiwara/isucon11-f · GitHub

スコア推移

やっていて、これだけ苦しい ISUCON は初めてかも知れません。何をしてもスコアに明確に響かない(けどサーバの負荷は僅かに下がる気がする)手を、最後には効くと信じて打ち込み続けるというのが本当にしんどい。

リアルでのパフォーマンスチューニングでは、明確に数字が上がらない施策を無闇に入れるのは避けるべきですよね。得られるパフォーマンスと、コードや運用の複雑さがペイしないと技術負債(しかもメリットなし)まっしぐらなので。競技中、ずっとしんどいしんどいって言ってました。

f:id:sfujiwara:20210921113651p:plain
スコア推移(最終上位3チーム+特別賞)

スコア推移を見ると、リーダーボードで自チーム以外のスコアが閲覧できなくなる17時直前に大きく伸びているのが分かります。

この時点で大きめの改善がマージ済みだったものの、db.SetMaxOpenConns(10) のままで MySQL の負荷が上がりきらないことに気が付いたので、 MaxOpenConns を 10 -> 20 -> 40 -> 60 と調整して最適値を探ってスコアを上げ、最後にダメ押しで今までずっと有効にしていた MySQL の slow query log を無効化して更に数字を伸ばした、というやつでした。

最終的には2位の NaruseJun もこの直後に10万点を超えて来ていたようなので、スコアが公開されている17時前に少しは盛り上げられてよかったかなと思います。

実際のスコアはリポジトリに保存してあります。 isucon11-f/scores.txt at main · fujiwara/isucon11-f · GitHub

最後に

近年の ISUCON ではもう年を食った社会人は若者や学生には勝てないんじゃないか、などといわれたこともありましたが、平均年齢38.7歳のおじさんチームでもまだまだ戦えることが示せてよかったです。

ただ個人的には、競技として洗練されて高度化していく方向が極まってきて、8時間以内に運営が想定したポイントを何個クリアできるか、あらかじめ設定された問題をどれだけ早く正確にこなすかのゲーム、になっているのが多少気になるところではあります。初期の頃の、誰がどんな手を繰り出して何をやってくるのか分からないみたいな空気を多少懐かしく思いつつ、まあこれも業界や時代の流れかなとは思いますが。

最後になりますが、楽しく快適な競技を提供して頂いた運営チーム、作問チーム、アドバイザリーの皆様ほか、スタッフの皆様にお礼申し上げます。本当に快適で楽しい ISUCON でした!(しんどかったけど…)