名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

ISUCON11の本選に参加してきました

undefinedとしてISUCON本遷に挑みました。

結果だけ見ると17位、55,533と振るいませんでしたが、良い経験になりました(賞ほしかった~~~~)。

前日

  • ワクチンの副反応でこの世の終わりを感じた
  • 21時くらいにテスコンの発表練習をする
    • これに関してはテスコンの振り返りで
  • 寝れない…
    • ワクチン接種→木曜日の夜から一日寝るをした結果、金曜日の4時過ぎくらいまで寝れなかった

当日

9:00

  • 予定より遅く起床した
  • テスコンのリハーサルに入る

10:00

  • ISUCONの決勝がスタート
  • 制約などの読み込み
  • アーキテクチャのチェック
    • lscpu とかして回った記憶がある
    • これは過去のISUCONの経験からCPU、メモリが異なるマシンが与えられてたケースがあったので一応確認した
    • 全部同じだった
  • アプリケーションを立ち上げてみて、軽く触ってみる
  • とりあえずRustに変更して、ベンチを回す
  • mosさんがDBをsource, replica構成の2台構成に変更し始める
  • pxfncさんがRustのコードを読み始める
  • 僕、nginxのセッティングなどをする
  • テーブル構造を眺める。特に変な点はない。

11:00

  • 僕、予定があるため中抜け
    • 11:30過ぎに戻った
  • mosさんがDBの2台構成に苦戦していた
  • pxfncさんが環境構築周りをしていた
  • 僕、MySqlのログを眺めて、遅そうなクエリやN+1クエリを探す
    • 結構同じようなクエリが流れているので N+1 クエリやばそうパターンだと考える
  • mosさんみながら僕がいろいろ調査
  • pxfncさんがDB接続先をsource, replicaにする実装を進める

12:00

  • 引き続きDB周り
    • ある程度動きそうな感じなのを見る
  • ベンチ回してまずいもの流れてないかいろいろ試す
  • mosさんがnot equal を in 句に変更
  • 僕、indexを雑に足す
  • pxfncさんとmosさんが履修登録周りを直し始める

13:00

  • pxfncさんとmosさんは履修登録周りで苦戦しているのを見る
  • 僕がDB負荷を見て、source側のDBはCPU100%で頭打ちしてるのに対し、replica側が15%くらいしか使えていないことに言及
    • replicaが正しく使えているのかちょっと心配になる
  • 僕がざっくりソースコードを読んで、N+1クエリと重そうなjoinしてるクエリを含んでいるリソースの一覧を出す
  • 一旦、この辺りからはN+1のこまごましているクエリを直す作戦になる

15:00

  • 履修登録周りがどうにかなる
  • 雑多なものを一部改善
    • ユーザー情報の取得でクエリ実行を辞める(sessionにコードを持たせる形にした)
    • コース取得時のN+1クエリを削減
    • select for shareを消してみる
  • 誤差レベルの修正を繰り返していたため、スコアが伸びず厳しくなってきた
  • 僕、zip書利回りを見るもあまり改善案が思いつかず…
    • pigz に至ったが、コア数の問題と手元で試していい感じに同等のコマンドにできなかったのであきらめる
    • 日頃からのツールの練習不足が響いている…

16:00

  • pxfncさんがアナウンスメントのinsertをbulkに変更
  • graph周りに手を付けないとこれはどうにもならないと判断して、僕が着手始める
    • Rustの型推論がわからなさ過ぎて、pxfncさんに型周りを聞きまくる
  • ファイルアップロード周りを何とかしないといけないと判断して、mos氏が着手を始める

17:00

  • どれもうまくいかない
    • 僕の改善では cource の group by クエリが結局重く、微妙な感じだった
      • mosさんが条件しぼるために in 句書いてくれていたけど、ベンチ落ちてしまったので結局入れられなかった
      • 結局これはあきらめて本流にマージせず…
    • mos氏がpigzと戯れていたりしたけど、難しそうという結論に至る
  • いろいろあきらめてログを切っていく
    • nginx, mysql, journal log...
    • これだけで7000点くらい上がった
  • 15分前くらいから再起動してみて問題ないことを確認して終了

18:00 以降

  • ワクチン接種の影響で、pxfncさんと僕は意識がもうろうとしていたので、YouTubeの配信が終わってからすぐ解散しました
  • gradeとzip圧縮、announce周りをcacheにするみたいな戦略は思いついたもののできなかったな~とか、3台目DBすいてたし、一部のリクエストはそっち流せばよかったんじゃないかな?とか、そういう反省をしていた

翌日

  • 17:00くらいから振り返りをする
    • 上位チームなどの戦略を読んだり、githubリポジトリを見に行ったり
    • Goは書けはしないが、読めはするので勉強になる
    • nginx設定、もう少し上位チームを参考にしようと思った
  • 18:00くらいから配信を見る
    • 体力が回付記しきってなかったので結構、意識がぼんやりしていた
    • 17位で、点数があるチームの中では下から2番目ではあったが、failedしなくてよかった
    • Rust使ってるもう1チームは18位のあのチームであるはずなので、Rust使ったチームの中では最高順位ということに一応なるのかなと思います
  • 懇親会が開かれていたみたいですが、非常に体がしんどかったので、配信見終わった後、結構すぐ寝てしまいました

今日

  • 懇親会のログとか眺めてほーんってなった
  • この振り返りを書いている

感想戦を見ていた限りの学び

  • 注力しなければいけないポイントについては見極めできていた
    • しかし対応するタイミングが遅かったので、何もできず…
    • graphとかは明らかにやばかったので、もっと見えているN+1クエリよりも優先してやればよかった
  • pdfのzipまわりについて
    • lnコマンドは知っていたものの、出てこず…(こういう時、実践力不足を感じる)
    • zip周りはコマンドを変更するのではなく、オプションを変更したりするのも手だった
      • 圧縮レベルの調整など
      • 圧縮時間と転送時間のバランスを考えた時に、チューニングするくらいはできたはず
    • 一時フォルダ
      • はい
  • graphの改善
    • Goの実装見てると全体のgpa計算は非同期でやっていて、あとで結果を取得する形にしてるチームが多かったように思う
      • 読んでみて確かにな~と思った
    • あとはなるべく1回でデータを取るための工夫を頑張らないといけない
  • announceの改善
    • 未読管理はcacheにする、はい
    • Redisを立ててつないで、みたいな経験がほぼなかったので完全に素振り不足だし、知識不足だった
    • ここだけ別のAppサーバに分けるのもあとから聞いて、自分たちの3台目をうまく使えていなかったことを感じた
  • ほか
    • nginx設定は上位チームから学ぼうと思う
  • 他の参加者が公開しているコードたちを読もう(ハッシュタグから拾ってきた)

くらいですかね…。わかっていてもやれなかったことが多かったのが悔しい点です。

あと予選でやれなかったことは引き続きできていないことだらけなので、来年に向けてまた復習していこうと思います。

とりあえずキャッシュサーバーを実用レベルで使えるようになりたいですね。

感想

他チームの方も触れていますが、本選はスコアが伸びにくいこともあり結構大変でした。

特にやった改善が1000~2000点程度の改善だと、ベンチの誤差範囲に収まるような程度であるので、改善したのかの判断も難しかったように思います。

また力不足を強く感じたのと、もっとやれる点がたくさんあるんだなと思えたのは本選に参加できて良かった点だと思います。

来年も同じチームで出るかはわかりませんが、来年に向けてのモチベーションは大きく高まったので頑張っていきたいです。

※ワクチン接種の関係で体調がよくなかったことや個人の都合など、いろいろありましたが、それらを差し引いてももっとやれたことはあるし、結構悔しい気持ちです。来年はそれらも万全にしておきたい。