れみゅーぶろぐ

某(元)高専生が多彩なジャンルにわたって書くブログ。非常に真面目なブログであると自負しております(要出典)。Twitter:@_remew_

console.log('ISUCON8に参加して今年も予選敗退しました')

ISUCON8の予選に参加して残念ながら予選敗退した遅めの日記です。

日程:9月15日(土)
チーム名:console.log

また、メンバーは以下の3人です。

他のメンバーが書いたブログの記事と、去年参加したときの記事もあるようなので合わせて読むのをおすすめします。

りぃねこ

rin-neko.hatenablog.com

たにし

tanishi345.hatenablog.com

去年の

foolish-oknct.hatenablog.com

最終スコア

とりあえず結果から書いておけばいいらしい、と自己啓発本とかに書いてあるので(要出典)結果から書きますが、、、

Best Score:8,938

追試結果:fail

つらい。

当日まで

去年と同じく使用実装をNode.jsにしました。

去年の反省を活かし事前にGitHubリポジトリを作成、そしてsshの鍵ペアとconfigを作成しておく神の一手。僕のISUCONはここで終わった。嘘。

なお、去年と違い、今年は椅子に座りませんでした。椅子CONなのに。

ついでに3人の役割分担をしようとしていた気がしますが、結局どうしたのかを覚えていません。 結果的には僕とたにしがアプリケーションのコードをいじり、りぃねこがミドルウェアの設定やらをしてくれたので多分そういう感じに割り振ったのかもしれません。

当日

起床〜開始直後

起床部門をギリギリで予選通過。ここで椅子に座った(椅子CONなので)。しかしいつの間にか床で作業していたので、椅子CONもといISUCONは僕に向いてないのでは?と思いました。

とりあえずサーバー情報を見る。3台構成。マジかよ、去年と同じか…と思いながら3人で1台ずつSSHの設定をするなどしました。オペミスが怖く、相互にSSHして入れるかを確認した記憶があります。

SSHの設定も終わり、実行サービスをNode.jsに変更。

とりあえず初期スコア見るか〜と思ってベンチマークに投げたらfailしてて草。参加者全員参加Discordにてなにかのサービスの再起動したら治るとの情報を見つけ、やってみたら本当に通った。スコアのメモを忘れる失態。

開始直後〜お昼

とりあえずアプリケーションのコードを見ると、そこには見たことがないフレームワークが存在していました。fastifyというWebアプリケーションフレームワーク、初めて聞きましたが速そうな名前だなぁと思ったのを覚えています。

GItHubのREADMEを見た感じだとExpressとルーティングは変わらないので読むのもそんなにつらくありませんでした。

読み進めていくうちに、getEventgetEventsでN+1問題あるなぁとか、予約の登録でORDER BY RAND()を見て笑ったりしてました。

また同じようなタイミングでWebサーバーがnginxではなくh2oであることに気づき、alp用のログフォーマットの設定をどうすればいいのかググったりしましたが「これあとあとハマりそうだしロードバランシングのやり方出てこないからさっさとnginxに変えた方が良さそう」という話になり結局nginxになりました。

りんちゃんかたにしにnetdataをインストールしてもらったり、nginxのルーティング設定に失敗してアプリケーションがバグったりnetdataが見れなくなったりしましたが、念じたら直りました。nginxのlocationの理解が浅くタイムロスをしてしまい、悔しい気持ちになったのを覚えています。

netdata見ながらベンチマーク回したらCPUが跳ね上がって3人で爆笑してました。ついでにログもalpに流せるようにしたところでお昼になりました。

お昼

ピザ、以上

お昼後

alpで整形された情報を3人で見て「ここアクセス多い」とか「これ時間たくさんかかってる」とか、そういう話をしていましたがこの辺の記憶が若干飛んでいて、何をどうしたのかあまり覚えていません。

僕がやったことを順不同で覚えているだけ書き出すと

  • sheetsテーブルは更新がないのにgetEventで毎回sheetsテーブルから情報を取ってきてるのが無駄だったので/initializeアクセスのタイミングで読み込んでグローバル変数に置くようにした
    • これでスコアがちょっと伸びてドヤ顔してた
  • getEvent関数のN+1問題をどうにかしようとしてfail祭り
    • タイポとか、プロパティ名間違いとか、そういうしょうもないミスばかり
  • (天気が悪くて低気圧で)頭痛いと喚く迷惑行為

くらいですね。

たにしは僕のコードをレビューしてくれたり、りぃねこと一緒にnginxのロードバランス用の設定をしたりしてました。

りぃねこは途中でnginxを用いたロードバランスを行い、スコアを爆上げしててかっこよかったです。めっちゃイケメンだった。本人はlsとcdが使えるだけの道路脇の小石だよとか言ってますが、道路脇の小石に感謝です。

また、最初にロードバランスしたときの構成が

  • サーバー1 → App
  • サーバー2 →Nginx+App
  • サーバー3 →App+DB

だったのですが、りぃねこの「これDBのCPU使用率高いからDBサーバーはAppなくしたほうがよくない?(道路脇の小石ボイス)」との発言により

  • サーバー1 → App
  • サーバー2 →Nginx+App
  • サーバー3 →DB

にしてみたところこれまたスコアが爆上がり。道路脇の小石強すぎる。

そんなこんなで道路脇の小石の功績によりあと一歩で1万点!というところで残り時間も少なくなり、僕たちはPCを閉じました。

そしてISUCONの終了時間になり、再起動試験。結果はFail。つらい。

反省

  • コード早く読めるようになりたい
  • 再起動試験の確認をしておくべきだった
  • 他の人が何をしているのかちゃんと把握できていなかった感
  • 結局最適化らしい最適化はほとんどできていない…
  • DataGripを使ってDB構造を可視化しようとしたが接続失敗しまくって時間ロスした

来年に向けて

来年(というか次回)参加する際はチームとして次のことに挑戦したいです。

  • ローカルに開発環境作る
    • Docker
    • ついでに本番環境もDockerで動かせたら複数台構成も楽そう(イメージ)
  • SQL力を高めてN+1問題を早く解決する

まずは基礎を固めないといけないなぁと思いました。感謝の正拳突きでもしようかな。