📚

ISUCON12に参加しました

2022/07/24に公開

@hanhan1978さんと@genneiさんの3人で出場しました。
初参加だったので、事前に3回ほど練習会して当日を迎えました。

問題

マルチテナント(Isuports)。
https://www.youtube.com/watch?v=75YnJ_3289g

目標と結果

初参加ということもあり、「ちゃんと楽しむこと」を中心に目標設定。

・最後まで手を止めない
 -> 達成
・100位以内を目指す
 -> 未達成
・スコアに響くコミットを1つ以上入れる
 -> 達成
・また参加したいねと思えるようにする
 -> 達成?

結果、3/4達成した。100位以内には入れなかったけど、150位以内くらいだった。

言語とかツールとか

  • 使用した言語はPHP。
  • 主に使ったツールは以下の通り。
・alp
・pt-query-digest
・Xhprof
・New Relic

役割分担

  • インフラ担当: @hanhan1978
  • アプリ担当: @gennei
  • アプリ副担当: @mettoboshi (担当)

自分は、特化しているステータス持ちではないので、空気を読んで二人の作業をサポートするぞ!という気持ちだった。

やったこと

8:30
集合。モニタとか椅子とかを準備して万全の体制を整える。

9:45
オープニングとかをみて、これがISUCONかぁと思った。何回もトイレに行った。

10:00
予選開始。構築はインフラ担当に任せて@genneiさんと二人でマニュアルとかを読む。

10:00-12:00
環境は順調に準備完了。ただ、計測し始めて想定外の「テナントのデータSqliteだと!?」ってなって、
色々考えてしまい時間をかなり溶かしてしまった。MysqlのSlow-Queryログも少なくて、初手何していいか
わからなくなって焦った。
ここらへんで、チーム的にはSqlite→Mysqlにしようという決断をした。@genneiさんにSqlite周りを任せて
自分はできることをやっていこうと決めてようやく動き始めた。
ここはもっとスムーズに作業ができたはず。反省。

12:19
とりあえず、見えている、ボトルネックを上から順番に倒していこうと決意。
まずは、MySQLのvisit_historyテーブルにインデックスを貼った。
スコアは上がらなかったのものの、pt-query-digest的には効果あったので、次のボトルネックへ。

14:12
id_generatorテーブルのボトルネックが次のターゲット。
一意に識別するためのIDがほしいだけなら、UUIDとかで良くない?と思って、置き換え。
テーブルアクセスをやめた。Failしなかったし、スコア的にちょっと上がったのでそのままにすることにした。
この時点でMySQLは無風状態になった。ここからはalp見ながら次の対応を検討。

14:00-15:00
この辺でSqlite→MySQLが時間的に間に合わないかもみたいな雰囲気になってきたので、
Sqliteのまま行くことも視野に入れてSqlite側のチューニングを始める。

15:23
テナントが増えたときに作られるDBだけでもいいからインデックスを貼れるようにするかってことで、
SqliteのDBに適当にindexを貼ってみる。いまいち効果がなかったので、一旦リバート

15:55
Sqlite側にもindex貼れることはわかったので、一番データが多そうなplayer_scoreテーブルかつ、
alp的に一番時間をくっているやつを狙ってindexを貼る。
alpの結果をみたら、avgが下がったのでこれは効果があると信じてこのまま突き進む。

17:21
ランキングのN+1を解消。
17:00時点で作業を止めて、色々な設定を消して行く段階だったが、泣きの再チャレンジ。
(すでに1回リバートしてた) 結果、1000くらいスコア上がったのでこれもこのまま行くことにした。

17:50
最後、1.dbに対して、手動で適当にインデックスを貼った。(安全なやつのみ)
もはやスコア的にはあがるのかわからないので、ここで無理する必要はなかったかもしれない。
Failしなくてよかった・・・

振り返り

計測、デプロイは凄くスムーズだったし、メンバーとの連携も問題なくできていた気がする。
8時間手を止めずに何かはやっていたし、ちゃんと目的をもって作業ができていたきがする。
ラスト15分くらいで入れたコードでスコアが1000くらい上がったので、やりきった感があったものの、やれることはまだまだあったのに時間が足りない!ってなった。

途中、インフラ側でリリースするたびに、スコアが1000とか2000とか上がって神が降臨したか!?とテンション爆上がりした。(最終的には入れてないけど、tmpfsでスコアが10000超えしたときが一番うれしかった)

個人的な感想としては、PHP得意じゃないとはいえ、1つ1つの作業に時間かかりすぎてるなーと反省。もっと手を早く動かさないと、やりたいこと全然終わりませんね。

チームとしては、Goはあえて選ばないという気合の選択をしたけど、Goじゃなくてもなんとかやっていけるのでは?と思えただけでも収穫はあった気がする。やれることは、まだ無限にあったしね。。

最後に

一緒に参加してくれた@hanhan1978さんと@genneiさん、素晴らしい会を開催してくださった運営のみなさまありがとうございました。とても楽しい一日でした。

また修行を積んでまた来年出たいな、と思いました。

Discussion