tekiehei2317's blog

ISUCON11予選参加記

投稿日: 2021-08-22

結果

チームRakuで参加して、最終スコアは947でした(惨敗)。当日はチームメイトで会社の先輩の@kami_tsukaiさんが体調不良だったので、Slackで応援をもらいながら1人で参加しました。

事前準備

時間やること
10:00-11:00環境構築をする
リポジトリをGitで管理する
最初のベンチマークを回す
言語をPHPに切り替える
11:00-12:00ツールのインストール(netdata/alp)
alpで計測できるようにする
12:00-13:00昼食
13:00-14:00ボトルネック改善1
14:00-15:00ボトルネック改善1
15:00-16:00ボトルネック改善2
16:00-17:00ボトルネック改善2
17:00-18:00再起動試験

予選当日

午前の部

  • マニュアルを読んで環境構築(10:00~)
    • Cloudformationの構築がなかなか終わらなかった(20分くらい経っていた)
    • マニュアルを読んで再度確認すると、間違えてバージニアリージョンで作っていたことが判明(草)
    • 東京リージョンに直して再度構築すると無事に構築完了
  • ベンチマークを実行(10:30~)
    • Goで2000点くらいを記録
    • PHPに変えて再度実行すると1000点になった
  • gitで管理する(11:00~)
    • 100MB以上のファイルは.gitignoreに入っていたのでありがたかった
  • alpで計測(11:15~)
    • ログを空にする方法が分からなかった(権限のエラー)
      • 調べるとteeを使えばよいことが判明して解決
    • Nginxのログファイルの形式を変更
    • IDがついているエンドポイント等をまとめて、無事計測完了
      • GET /api/isuが重そうだなぁというのと、GET /api/condition/:jia_isu_uuidで400番のエラーが出ていることが分かった
  • ドキュメントの確認(12:00~)
    • スコアの計算方法を確認
      • GET /api/condition/:jia_isu_uuidのエラーを解消すれば伸びそうだなと思った
      • グラフのところは複雑そうだったのでとりあえず飛ばした
    • アプリケーションマニュアルの確認
      • 流し読みしたので全然覚えていない
    • とりあえずお昼休憩を挟んで、午後からの作戦を考えることにした

午後の部

  • PHPに変えたことでスコアが下がった原因を調べることにした(13:00~)
    • Nginxのログを確認すると、GET /api/condition/:jia_isu_uuidで499が返っていることが分かった
    • 調べると、サーバーがレスポンスを返す前にクライアントが接続を切ると499になることが分かった
      • マニュアルに、100msを超えたら〜みたいなことが書いてあったため、これかなぁと思った
    • 一応ソースコードを確認してみるも、問題がある処理があるようにも見えず諦めた
      • 引き出しがなさすぎて何も出来なかった
  • アプリケーションのログを確認しようとした(13:30~)
    • 標準出力に出る設定になっていたが、確認方法が分からなかった
    • ファイルパスに変更してみたものの、記録されなかった
    • 結局あきらめて、ブラウザからレスポンスボディを見てデバッグすることにした(草)
  • GET /api/isuのN+1を改善することにした(14:00~)
    • 一番重そうだったので確認するとN+1を発見したので、直すことにした
    • これが原因でリソースが足りなくなって、GET /api/condition/:jia_isu_uuidが間に合わなくなっているのかなぁと思った
    • PDO使っているっぽかったが、使ったことがなかったのでとりあえず素振り
      • PDO 使い方 検索
    • クエリを作成してMariaDBのコンソールから実行し、上手く出来ているっぽいことを確認
    • 本番環境に移植
      • 適当にやりすぎて、ベンチマークの互換性チェックが全然通らなくなった
      • PDOに苦戦しつつも、元から使っていたクラスにJOSNの整形処理を任せることで何とか解決
    • ベンチマークの結果、alpの結果もスコアも変わっていなくて少し悲しくなった
  • ISUを温める(17:00~)
    • 適当にindex貼ったり、クエリをちょっと変えてみたりしたが特に変わらなかった
    • そうこうしているうちに、どこに手をつければいいのかが分からなくなった
    • お腹が空いたのでコンビニでメロンパンを買って食べた

反省点

一言で言えば練習不足ですが、今回特にマズかったなぁと思う部分を2つ書きます。

PDOを全然分かっていなかった

JOINしたテーブルを別々のオブジェクトで欲しかったのですが、やり方が分からず苦戦しました。SQLの改善や変更は色々な場所でやると思うので、DBの接続部分のプログラムを書く機会は多いと思います。そのため、PHPの場合はPDOに慣れている必要があると感じました。

マニュアルを読み込まず、憶測で改善を進めた

1000点で打ち止めになっていたときに、原因に明らかにしなかったことが反省点です。N+1を改善すれば直るかもしれないと、憶測で進めたのが完全に悪手でした。まだ原因は分かっていませんが、マニュアルや、ベンチマークのログをもっと見ていれば、もう少し良い手を打てていたかなと思います。

感想

あまりにも何も出来なさすぎて、プログラミングを始めた頃に感じた気持ちを思い出しました。とてもくやしい。来年もリベンジしたいので、今から毎日少しずつ(2分でもいいので)ISUCONに関わる何かをやろうと思います。

アルゴリズムやセキュリティ、機械学習のコンテストと比べると、まだ入門書の決定版と言われるような書籍が出ていなかったり、全く分からない人がなんとなく出来るようになるためのレールが敷かれていないのかなと思いました。自分はまだ分からない側にいるので、こちら側からレールの作成の手伝いが出来たらいいなと思います。