ISUCON初参加

投稿日: 2022-07-25

こんにちは,ぬまです。

今回初めてISUCONに参加したので記録を残したいと思います。

初めての参加なので結果の良し悪しは置いておいて,何を学んで次回どうするのが良いのか反省点などについて考えていきます。 結果は2855点と言うという点数でした。ほとんど初期状態と変わってないです。 score

使ったツール

  • alp - log解析ツール
  • qt-query-digest- MySQLのスロークエリーログ解析ツール
  • top - 負荷計測ツール

やったこと

 まず,問題文を読み,デプロイを行い,webサービスを見てみました。 明らかに読み込みが遅いことが見てわかりました。 その後,パフォーマンスを計測しようということで,サーバーにツールの導入しました。初参加で右も左も分からなかったため,秘伝のタレなどなく,自力で導入しました。このときにNginxに慣れておらず,alpで解析できるようにnginxのログ形式を変更にするのに苦戦しました。

 チームメンバーがMySQL用にpt-query-logを導入してくれたので,とりあえず,計測し,MySQLがボトルネックだとわかりました。 MySQLの負荷を下げるためにhistroy_visitテーブルが明らかに遅く,探索レコードの数が多かったのでindexを張りました。index後に計測するとしっかりパフォーマンス向上を確認しました。

 次に,スロークエリーログを見るとid_generatorが無駄にIDを生成しているのでUUIDにすることで無駄なアクセスを無くしました。  この時点で16時すぎていて,かなり時間がない状態でした。最後にN+1問題がたくさん散見されたので,計測結果からボトルネックとなるクエリをjoinによって改善してみましたが,エラーででできませんでした。  

反省点

  • 言語決定
    当日になっても言語が決まらず,チームメンバーでGoで行く話でしたが特に誰かができるわけでもなく,Node.jsの方が読みやすかったので途中まではGoの環境でパフォーマンスを向上していき,一人のメンバーが他のサーバーで速い言語でパフォーマンスを計測して速いものを採用していきました。初期実装のGoかあるいはみんなが少なくとも経験のあるNode.jsに絞って戦うことで,問題に立ち向かえると思いました。

  • 実装分担
    全員が初心者ということもあり,一つ一つの計測,ボトルネックの発見,実装まですべて三人で相談しながら行っていました。時間が無限にあればこれでもいいかもしれませんが,制限時間内でスコアを伸ばすことを考えたら,各自の得意分野やできることからどんどん改善し,困ったら相談という方針でも良かったのかなという反省です。

  • 実装方法
    これもまた経験値のNASAから来ることですが,デプロイが終わった後に「これどうやって改修するの?ローカルで開発はできないの?」という疑問に陥りました。メンバーの一人がサーバー上のコードをscpでローカルに持ってきて,githubに共有してくれましたが,ローカルでdocker-compose upをしてもpublic.pemを変えないと立ち上がりませんでした。(もちろんテンパっていたのでなにがいけないのかすらわからず。)過去問練習ではrepositoryが公開されていたので,それを使っており,本番でもそのような形で配布などあるのかと思ってました。ローカルの環境でテストができないため,改善もどうする?という話の中,結果的に慣れないviでの修正に走りました。nginxの設定もvi上で行い,かなり時間を使いました。

  • SQL, リバースプロキシ関連のIT知識不足
    SQL自体をINNER JOINに書き換える際にバグを埋め込んでいたり,serverの各ツールを使って計測したときに結果がなんなのか読めていなかったり,Nginxの設定で煮詰まったりと参加以前に基本的なスキルが欠落しているのがわかりました。参加した結果,僕はSQL,Nginx,トランザクションなど基本的なスキルが皆無であることと,アプリケーションを速くするための基本スキルがないことがわかりました。

おわりに

 結果としては全然ダメダメでしたが,CPU負荷率を計測し,改善を施した後に,負荷率が大幅に減少した瞬間に,「お!!楽しい!」という感覚に襲われたので,来年ではもっとスキルをつけて再チャレンジしたいと思います。一緒に出てくれた@Bapliscaくんと@YSSくんありがとう!来年はもっと力をつけて出ましょう。このブログで書いた反省点は他の人たちに当てはまるかわかりませんが,僕たち(私たち)はこういう反省があった,こういうふうに進めると良いよなどあればご教授願いたいです。おすすめのブログなどもあれば読ませていただきます。
 この反省点と他の参加者の参加記録を読んで来年に繋げたいと思います。