💪

社内の偉い人と陽気な人でISUCON13に参戦した話

2023/12/12に公開

はじめに

このブログは株式会社FLINTERS10周年記念ブログリレー企画の95日目になります。

優勝賞金100万欲しい!なんか楽しそう!
という私の軽いノリをきっかけに社内の人を何人か誘って今回ISUCON13にチームフォーム入力でマウスは甘えで参戦しました。

この記事はその感想、本番当日までの準備〜当日の振り返りなどです。

最初に結果ですが、Go言語でスコア18780111位でした。ゾロ目で縁起がいい!

チーム紹介

killit

普段フロントエンドをやってる常に陽気な人、一番最初に私がISUCONに誘って快く承諾してくれる。
当日はDB、アプリ周りの担当。

kawachi

CTO偉い人、弊チームの主戦力、最終兵器。参加していただいたときは心の中でガッツポーズをした。
当日は遊撃手。

wakye5815(私)

普段バックエンド、インフラ周りをやっている人、本番前日眠れなくてISUCON用ansibleをいじっていたら寝坊をする。当日はアプリ、インフラ担当

本番までの練習やら勉強

ISUCON本読み、private-isuを触る

7月初頭にisuconやろうぜ!と思い立ち人を誘ったはいいものの全員ISUCON何もわからん!状態だったのでとりあえず達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践を週一で社内ISUCON勉強会を開催して輪読していくことにしました。
https://www.amazon.co.jp/達人が教えるWebパフォーマンスチューニング-〜ISUCONから学ぶ高速化の実践-藤原-俊一郎/dp/4297128462

ほーんISUCONそんな感じねとふわっとした解像度と有用そうなツール群の使い方だったりを覚えて読み終わった後は、private-isuを触ってここをこうしたら早くなるんじゃね?など喋ったりなど緩く練習をしていました。
https://github.com/catatsuy/private-isu

社内勉強会にしたおかげで有識者の方に解説をちょいちょいいただけたのがかなりありがたい、圧倒的感謝。

過去問練習

残り1カ月を切ったのでisucon-12-finalを題材にISUCON解像度上げと色々とあるプロファイリングツールの使用感を確認する当たりを目的に過去問の練習していきました。
環境構築はこちらのamiと公式が公開していたスペックを基にawsで作成。

この時点で検討していたプロファイリングツールは下記です。

  • alp(nginxのアクセスログ解析)
  • pprof(Goのプロファイリングツール)
  • pt-query-digest(slow query解析)
  • opentelemetry

オンラインで集まって4,5hほど初動とアプリケーション修正をすこしやってみましたが一点も上がらず最後にベンチマーカーでFailで終わるという先行きが不安な結果になりました、大丈夫か。。

一方で得るものもあり

  • 我々のチームメンバー全員Goの練度が足りなくてつらい
  • opentelemetryをGoで仕込むのは割と手間である(newrelicはもっと時間かかりそう)
  • alp,pt-query-digestは仕込みが手軽で十分な情報が得られる
  • pprofは読む解くのに少し慣れが必要そうかつ、opentelemetryなどのapmで十分そう

などが分かり最終的に

  • 言語はapmの仕込みが容易、メンバー全員がある程度書けるnode
  • プロファイリングはalp,pt-query-digest,newrelic

でいくことに決め、後日isucon-12-finalを再度上記スタック素振りして終わり、そこから本番まではansibleのplaybook作成、それぞれの役割分担や初動のTODOをまとめたドキュメント作成をして備えました。

本番タイムライン

時間 スコア やったこと
10:00~11:00 3483 Cloudformation突っ込んで環境構築とプロファイリングツール仕込みだったりremoteにコードをuploadした。ssh入れないと思ったらタイポをし続けていたり、用意していたansibleがこけたりでかなり時間ロスしてみんながコード見れたのが10:40くらいになってしまった。とりあえずGoのままでベンチ回す。
11:00~12:00 5396 コードリーディング。nodeでまさかのhonoが使われていてnewrelic使えないのでは?となりapmなしで初期スコアが高いGoに急遽変更。ansibleがコケてたせいでプロファイリングがうまくいかない、手動で修正。kawachiさんのdbを別サーバに移す、AレコードのTTL設定対応でスコアが2000くらい上がる
12:00~13:00 6758 プロファイリングができるようになったので修正するところに目星をつけ始める、その間にkillitさんがindexはって1000点ちょっと上がる
13:00~14:00 9743 kawachiさんがユーザーのicon取得処理でキャッシュを効かせるようにしてなんかめっちゃ点が上がる。私はngward追加処理が重そうだったので修正を始める
14:00~17:00 9743 ngward追加処理でとりあえずn+1を削除するのとLIKEでngwordマッチしているところをアプリ側の正規表現で処理させる実装を終わらせたがGoの練度が足りないせいでひたすらコンパイルエラーとランタイムエラー祭りで挫けかける。他メンバーも詰まったり既存のエラー解消で特に点数伸びず
17:00~18:00 確か16000~17000 三台構成にするとdns周りでエラーが出てしまうので二台構成であきらめて最後アプリ側できるところの修正。ラスト30分でkawachiさんのユーザーランキングクエリの修正で16000~17000くらいまで上がる。私のngwordもようやくコンパイルが通り遊ばせていた3台目で点数が上がったのを確認したのでラスト2,3分でマージ。ベンチ開始は間に合うも実行中に時間切れになってしまい最終スコアをみたら18780だったので200点前後くらい上がっていそうだった。

感想

  • わかっていたことではあるがGo力が弱すぎる、本来の問題解決の時間じゃなくてGoの構文エラー等々と格闘する時間が大きすぎた
  • 初動にケアレスミス、検証不足で時間をかけすぎてしまった。ansibleは一回くらい動かしておけばよかった
  • 私たちのチームはオフラインで集まってisuconに参戦したがこれはかなり効果的だった。
    • 凡ミスをパッと横の席で指摘してもらったり、サーバー空き確認など口頭でスピーディにできた。あとワイワイ感がとても良い。
  • 意外とapmなしでalp,pt-query-digestのみでもスムーズに解析改善に繋げれる。Goだと導入の手間考えたらapmなしでいいかも。
  • 前日にちゃんと寝るべし。
  • isuconはめちゃんこ楽しい、来年は上位30位あるいは本戦出場するぞ!

Discussion