😆

ISUCON14に参加しました

2024/12/17に公開

こんにちは。matchasongです。
2024/12/08(日)に開催されたISUCON14にチーム「慎太郎」の一員として参加しました。
ISUCONへの参加は4回目となりました。

振り返り記事を書いていきたいと思います。


メンバー

@kangaechu インフラ
@yktakaha4 アプリ
@matchasong SQLインデックス追加


結果

最終スコアは8319点でした。163位のようです。

スコアの推移


情報

言語:Go
エディタ:(GoとSQL)Goland, (設定ファイルなど)Visual Studio Code
リポジトリ:GitHubのPrivateリポジトリ
CI:GitHub Actionsによる静的チェック、ビルドチェック
プロファイル:pprof, NetData
ログフォーマット:alp, pt-query-digest
チャット:Discord


やったこと

事前練習

今回は以下の2点を意識して練習しました。

  1. 根拠を持って修正点を決める
    過去3回の参加では、改善箇所の選定において、ソースから目についた箇所を修正するという動きが多かったです。
    このため、修正はしたものの実はボトルネックではなく、効果が薄いことが多かったという反省がありました。

今回は根拠を持って修正すべく、NetDataでのメトリクス取得、pprofでのプロファイリングを練習しました。
pprofについては前回までも利用していましたが、フレームグラフからソースを見てボトルネックを把握するという使い方を練習しました。

  1. 終了直前の動きを事前に決める
    前回の反省として、終了直前に変に時間ができてしまったり、再起動確認を忘れたりということがありました。
    競技終了1時間30分前ぐらいからの動きを決めました。

    GitHubのProjectに書いたTODOリスト

当日

  • 9:30 集合

  • 10:00 競技開始
    まずは@kangaechuがCloudFormationの実行とインフラ設定を行いました。
    並行して@yktakaha4と私でマニュアルの読み込みを実施しました。

  • 10:30ぐらい
    初回のベンチマークを実行しました。
    最初は環境構築途中であったためFAILしましたが、2回目で正の得点が出ました。(1000点ぐらい)
    このタイミングでログイン確認も実施。バタバタしつつも全台へsshログイン+DB接続できることを確認しました。

  • 11:00ぐらい
    自分はGitHub ActionsでのCIを設定しました。
    フォーマット、静的解析、ビルドを自動実行する設定ですが、今回は静的解析が落ちてしまうため後でコメントアウトすることに...。
    @yktakaha4がアプリコードにpprofを適用し、プロファイルが取れるようになりました。

  • 13:00ぐらい
    自分はDBインデックスの付与を実施しました。
    同じインデックスを複数回貼ってエラーになったり、利用していないDBサーバに貼ったりとミスを繰り返しましたが、13:00ぐらいまでには一通り貼り終えました。
    @kangaechuがDBサーバの分割を実施し、マッチングロジックにトランザクションをはりました。
    @yktakaha4はアプリコードの改善に入っていました。

DB分割とインデックス適用が反映された時点で6000点台後半ぐらいまで上がりました。

  • 15:00ぐらい
    @kangaechuと一緒にアプリコード修正。と言っても自分はGoの理解度が足りず、横から見ている感じでした...。
    「そこのSQL、nullが出るならCOALESCEでいいんじゃんないですか」とか適当なことを言って惑わせました。(すみません)

  • 17:00ぐらい
    前回の反省を踏まえて再起動チェックを実施。再起動してもアプリが問題なく動作することを確認しました。

  • 17:30ぐらい
    internalGetMatchingのマッチングのSQLを改善しようとしましたが、どうにもエラーが解消せず断念。
    @yktakaha4がchairGetNotificationのパラメータを調整し、8000点になりました。
    @kangaechuがログ停止などの後片付けを実施しました。

  • 18:00ぐらい
    競技終了。

感想

  • ○初動と終了動作はスムーズ
    最初の動きと、前回課題であった終了直前の動きともにスムーズでした。

  • ○インデックスの付与は独立して動けた
    ここはできたかなと思います。ただ今回難しかったので漏れている場所はありそう...。

  • △CIでのチェックが微妙
    今回はアプリは一応動いているのにgo vetで余計なエラーが出たり、逆にCIでチェックしていなかったSQLのエラーで苦しんだりしました。
    CIの設定は改善の余地ありかもしれません。

  • ×アプリのコード修正はできなかった
    ここは前回からの課題が持ち越しとなりました。
    今回はインデックス貼り終わりの14:00ぐらいから、3〜4時間あったにも関わらず1つも修正が入れられなかったのは悔しかったです。
    Goのデバッグに手間取ってしまったので、ログの出し方とか基本的なところを勉強したいです。
    また、その関数だけしか見ていませんでしたが、全体的な影響も見るべきだったのかなと思います(isuの座標位置をプリントデバッグして時間変化を見るとか)


@kangaechuさん、@yktakaha4さん、毎年一緒に参加させていただきありがとうございます。
運営の皆様、楽しいイベントをありがとうございました。
次回こそは2桁順位を目指して頑張りたいです。

Discussion