ISUCON14挑戦記

## はじめに
この記事は[Progaku Advent Calendar 2024](https://qiita.com/advent-calendar/2024/progaku) 11日目の記事です！

今回、プログラミング学習コミュニティProgakuのメンバーとチームを組んでISUCON14に初めて参加したので挑戦記と題してまとめたいと思います！

**チーム名**: 琉球覇王いな卍@喧嘩無双  
**メンバー**: @inakuuun @masayasviel  

### メンバーの参加記

https://qiita.com/masayasviel/items/37b5c90602d7867e98dd#%E5%89%8D%E6%97%A5

---

## 結果
**言語:** Go  
**最終スコア:** 8033  
**順位:** 176位  

という結果でした。  
上位陣のスコアとはとてつもない差はありますが、個人的に楽しめたこと、FAILにならず最後までやり遂げられたこともあり満足の結果となりました。（来年出るなら1万点超えを目指したい）

---

## 当日までにしたこと
- Linuxの学習（基本的なCLI操作、パーミッション、シェル、ファイルシステム等）
- データベース、SQLの学習（実行計画、INDEX、クエリの実行順等）
- インフラ周りの学習（AWS、ネットワーク、TCP/IPなど）
- Goの学習（基本文法、API作成、DB周りの扱い）
- ISUCON本輪読会
- private-isuを解く
- ISUCON13の過去問を解く
- スロークエリ自動化スクリプトの作成

コミュニティ内では主に以下のISUCON本を使った輪読会やprivate-isuを解くことを中心に行いました。

https://gihyo.jp/book/2022/978-4-297-12846-3

ただ、前提知識が無さすぎて、本の内容を読んでも何一つわからず、頭に入ってこない状態でした。

Linuxわからない → 基本的に秘密鍵でSSH接続し、サーバ内ではCLIで操作するのでお話しにならない

Goわからない → ソース読めない、変えれない

インフラ周りわからない → 過去問解く環境作れない

DBわからない → クエリの改善できない

みたいな感じですね（笑）

ISUCONに挑戦するスタート地点にも立てていなかったので、上記のように足りない知識を補うことにほとんどの時間を費やしました。

### 参考にした本・記事

#### Linux関連
シェル、プロセス、パーミッション、基本的なCLI操作等

https://www.sbcr.jp/product/4815624316/

#### DB関連
SQLの基本的な文法や使い方など

https://www.shoeisha.co.jp/book/detail/9784798118819

SQLの実行順序、仕組みなどパフォーマンスを意識した使用について

https://gihyo.jp/book/2019/978-4-297-10717-8

#### インフラ、ネットワーク周り
AWSの各機能の概要をざっくり掴むのに

https://gihyo.jp/book/2019/978-4-297-10889-2

IPやポート番号など、ネットワーク周りを理解するのに

https://www.sbcr.jp/product/4815623333/

#### Goの学習
Goの学習は公式チュートリアルを一通りやった後、下記の本で簡単なAPIサーバー作成までしました。

https://go-tour-jp.appspot.com/welcome/1

https://techbookfest.org/product/jXDAEU1dR53kbZkgtDm9zx?productVariantID=dvjtgpjw8VDTXNqKaanTVi

このさきさんの本は個人的にかなり良かったです。
API作りながらGoを使ったアプリケーション作成の基本が網羅できるので、過去問のソース読んだり、追いかける際にとても助けになりました。

#### private-isu、過去問関連

https://isucon-workshop.trap.show/

https://qiita.com/masayasviel/items/353024f7f2e292572942

https://qiita.com/kaito_399/items/e1d8a383bacd534db641

https://engineering.nifty.co.jp/blog/23409

## 当日

### 初動
初動は以下を行いました。
- ソースのGit管理
- Goのインストール
- DB分割(不要なサービス消し飛ばすところだけ）

Git管理の際、作業途中でスーパーユーザに切り替えたことによって秘密鍵やconfigの設定が反映されず手間取ったり、DB分割作業後にGoのサービスが停止してスコアが0になるというハプニングもありました。
ただ、チームで過去問を解いている時も当日も、メンバーが一つひとつどこまで動いているかを丁寧に確認する習慣を徹底してくれていたおかげで、落ち着いて対処できました。
このお陰で一つひとつの事象に対する確認方法の引き出しもかなり増えていたことも大きいですね。

僕は焦ると確認を疎かにしてしまうところがあるので（当日もちょっとやってしまいましたが笑）、今後も意識して改善していきたいなと思います！

### 初動以降
お昼ご飯休憩を挟んでから終了まではあっという間でした。

- **pproteinの導入**: メンバーが即座に対応
- **ボトルネックの特定**: アクセスログやスロークエリログを元に分析
- **改善作業**
  - 他メンバー: nginxの設定最適化、INDEXの追加、N+1問題の解消
  - 自分: スロークエリログ上位にあがっていたプリペアドステートメントと不要なトランザクションの除去

#### プリペアドステートメントの解消
```go
// mysqlドライバーのConfigに以下を追加
config.InterpolateParams = true
```

#### 不要なトランザクションの除去
SELECT文でのみ使用されるエンドポイント（例: `appGetRides`, `appPostRidesEstimatedFare`）からトランザクションを除去しました。共通関数が`sqlx.Tx`型を引数にとる構造だったため、`sqlx.DB`型用の関数を新たに作成して対応しました。

これらの作業でスコアは2000ほどアップしました！

### 終盤
メンバーと事前に決めていた17:30のタイムリミットまでアクセスログを基にボトルネックとなるエンドポイントの処理を見ていましたが、解決策が見つかる前に時間切れ。
その後、みんなで確認しながら以下を実施しました。

1. ログの削除
2. pproteinの削除
3. envcheckの実行（追試対策）

最終ベンチで8033点を記録し、当日最高スコアを達成しました！
嬉しかった！笑

---

### まとめ
以上、ISUCON14挑戦記でした！

初参加で当日終えてみての感想としては、めちゃくちゃ楽しかったです！
正直、難しくて心が折れそうな瞬間も多々ありました。それでもやり遂げられたのは一緒に勉強してくれたProgakuのメンバー、いつも楽しく素振りしたり作戦会議してくれたチームメンバーのおかげです！感謝！！

また来年もぜひ参加したいと思います！その際は、アプリケーションの仕様をしっかり理解したアプローチや、キャッシュ周りやデータベースの知識をさらに深めて挑戦し、より良い結果を目指したいです！