こちらは夏のブログリレー11日目の記事です。
こんにちは。mehm8128とittです。
1ヶ月前の7/23(土)に開催されたISUCON12に参加してきた話を書きます。
チーム名は「:fuffuffuffuffuffuffuffuffuffuffu:」です。
これは部内SNSであるtraQに登録されているスタンプに由来します(やりとりの一部省略)。
フッフッフという赤い文字で埋め尽くされているスタンプですね。
戦力
2人とも普段はフロントエンドをメインで書いているので、主にバックエンドやインフラをいじるISUCONはどのくらい戦えるのか不安でした。
対策としては部内ISUCONのPISCONに参加して雰囲気を知ったり、先輩が開催してくださったISUCON講習会に参加したり、部内wikiにまとめられている先輩たちの知見を読んだり、くらいでした。これでmakefileやツール周りを整えたり、本番の流れを確認したりしていました。と言っても大学の課題などで忙しかったりで2人揃って練習、みたいなことはできなかったので知見をMDにまとめておく、くらいでした。
言語はバックエンド寄りだと@mehm8128はGo、@ittはRustが一番書けるのですが、部内に知見が多そうだったり@ittはGoの基本文法くらいは勉強したのでGoで参加することにしました。
本番
ツール
使ったツールはこちらです。
- alp
- pt-query-digest
- pprof
- netdata
と言っても上2つをメインで使っていました。
コミュニケーションはDiscordを使っていました。
ログもmakefile書いてcurlでDiscordに投げられるようにしていました。
タイムライン
致命的な勘違いをして最後まで進んでしまったのですが、途中で解説します。
10:00 2410点
@mehm8128がサーバーに入ってgitの設定とかmake setupとかしてる間に@ittがマニュアルとかコードとかを眺めてました。
10:40
ログを見てみたところ、visit_historyがボトルネックそうなのでコードを眺めてみました。
visit_historyのupdated_atが使われてなかったので、@ittがそれを使うようにしてレコード数を圧縮するようにしてみました。
と、ここで既に勘違いをしています。
今回Twitterでもトレンドに入っていたように、SQLiteとMySQLが一緒に入っている環境だったのでpt-query-digestだとMySQLのスロークエリログしか取れてないのですが、最初に出ていたvisit_history(とdispenseIDのやつ)を改善すれば他のスロークエリも出てくるかと思ってここの改善をひたすら進めることにしてしまいました。
出力されたスロークエリログがPISCONのときに比べて明らかに少ないとは思ったのですが、そういう回もあるのかなくらいに思っていました。
11:30 3206点
@ittがvisit_historyのupdate_atをいい感じにしている間、@mehm8128はdispenseID関数でシステムで一意なidを生成しているところをuuidにする実装をしました。
そして、update_atの改善は何回かfailしたりしたのですがなんとかベンチマークが通りました。
12:30 3154点
@mehm8128がindexを追加してみたけどfailしました。
これで点数出たらお昼休憩にしようとしてた気がするのですが、なんか変なことをしちゃったらしくて直らなくてちょっと焦ってました。
13:00 2966点
DBがバグってそうなので、マニュアルに書いてある「データベースのリカバリ方法」をやってみました。コマンドの方ではなくて、「インスタンス作成時点のdumpファイル」を使う方です。
これやったらようやく復活してくれて、ベンチマークが通ったので1時間くらい昼休憩にしました。
14:00 3497点
昼休憩が終わり、戻ってきたら@mehm8128の家のwifiが死んでました。いつもノートパソコンで作業しているのでwifiが死ぬと死にます。
コード書くのはローカルでもできるので、githubにpushするときだけスマホからデザリングして通信料を抑えつつ作業しました。通話はスマホからDiscordに入りました。
さっきはvisit_historyテーブルのsqlファイルにindex張るコードを書いてしまっていたのですが、マニュアル読んでみたらこれは使われてないことに気づいたので@ittにお願いしてmysqlに入って直接indexを張ってもらいました。これと@ittがupdate_atをさらに修正してくれてちょっと点数上がりました。
16:00 6263点
@ittがさらにvisit_historyを改善するSQLを書いていました。ヤバそうな2重ループを解消するために、検索しながら長いクエリを書いていました(競技終了まで)。@mehm8128がpt-query-digestを無視してalpで上位に入っているエンドポイントを眺めてみました。するとbulk insertとか実装できそうなところがあったのでスロークエリログになかったところも一応実装してみたら、ここで点数が2倍くらいになって驚きました。
retrievePlayersという関数も実装したのですが、failしたのでそこだけ一旦諦めました。
16:45 6944点
いわゆる秘伝のタレを投入しました。
17:30 7687点
@ittに頼んでさっき張った複合indexの順番を逆にしてみてもらいました。
そうしたらまた一気に点数上がりました。
18:00 6876点
最後にログ切ったりベンチマークガチャしたりして終了しました。
全体では145位、学生では16位でした。
反省点
アプリの構成を把握しきれずにsqliteのスロークエリログが取れていないことに気づかなかったのと、スロークエリログ以外の情報からあんまり分析しなかったのが一番の敗因だと思います。
次回までにインフラとかもっと勉強して、来年は順位を上げられるように頑張りたいです。
明日の担当は らす さんです。お楽しみに!