こつつみ

コツコツ積み上げる

Node.jsでISUCON13に参加した

ueshoです。久しぶりにブログ書きます。

2023/11/25に開催されたISUCON13に Buzoimajo と一緒にチーム「slasher」として初めて参加しました。個人では昨年はPython移植作業を担当させていただきましたので、どういうコンテストなのかは分かっていました。 言語はみんなが触ったことのあるTypeScriptであるNode.jsでやりました。

これは、競技中にYouTube配信で流れるチーム紹介のスライドです。期限を忘れて編集ロックかかってしまいました🤣

チーム紹介スライド

事前準備

初参加なので、初動の確認を含めてチームで問題を解くのは、10月末から3時間を4回くらい行いました。 最初の2回くらいはISUCONの説明と初動の確認をして、その後、ISUNARABEを使ってISUCON12予選を解きました。

個人では、private_isu を(Go言語で)20万点まで、ISUCON12予選をNode.jsで解きました。

デプロイ方法等は、チーム「織時屋」のリポジトリから拝借してMakefileで行いました。

初参加ということもあり準備段階でツールの使用方法、Nginx, Mysqlの設定、初動何するかとかを考えることで結構時間を使って過去問解きが少なかったです。

本番当日

Buzoとimajo がアプリケーション担当、自分がインフラ担当という役割分担をしました。(本職はアプリケーションなので、何すれば良いか分からずアプリケーションの改善をしてしまいました) Buzoとimajoでindexを貼ったり、N+1を潰したりをしてもらい結果的に6793点でfinishしました。自分は何もできず終わりました。

ISUCON13 受賞チームおよび全チームスコア : ISUCON公式Blog

自分目線で反省の意味も込めてやったことを記載します。

  • 10:05 初期実装(Go)でベンチを回す。スコア3636点
  • 10:10 リポジトリのセットアップ
  • 10:20 Node.jsに切り替え。mysqlのパラメータ修正。かつ、alp, pt-query-digest, notify_slackのセットアップ完了。ログをとるも何と設定したサーバーが違っていた、、
    • てっきりベンチマーカーの初回の向き先は必ずServer1になると思っていたので、困惑しました。
    • また、ポータルのどこからベンチマーカーの向き先を変えるか分からずServer3をメインで使いました
  • 11:00 ここでやっとセットアップ完了。Node.jsでスコア2642点
  • ~13:00 alpの結果からiconが遅く、かつ、画像がDBに入っていたので、private_isuと同じだ!と思い、nginxから配信するように変更しようとした。アプリケーションマニュアルにあるicon_hashや304をどうすれば良いか分からず、結局断念。
  • ~14:00 DNSmysqlをServer2に移行させようとするが、ベンチがFailで失敗。深追いせずやめ
    • おそらく後述のDBにユーザーを作っていなかったのが原因。
  • ~15:00 moderateのN+1に着手。少し改善したが、SQLの根本的な改善はできず、、、
  • 16:00 そろそろ複数台にってことで、アプリケーションのDBをServer1に移行しようとするも接続できず、、、
    • ISUCON12のようにIPとbind_address = 0.0.0.0設定すればいけたので、それしかやらず
    • 実際には、isucon@localhostなユーザーしかいなかったので、対象のインスタンスにアクセス可能なユーザー作る必要がある

振り返り

過去問だけなぞってやるだけで、ミドルウェアの仕様をちゃんと読んでおくということはしなかったので、こういう結果になってしまったと考えています。詰まった時に、思い至れるようにしておくというの大事です。 Nginxの設定や、コネクションの設定など、やりたかったのにできなかったことも多々あるます。また、DNSは知識がなさすぎて、手をつけられずという状態だったので、しっかり復習をして自分の知識にしたいと思います。

最後に

運営の皆さんありがとうございます。楽しいコンテストだったので、来年も参加します! 誘って参加してくれた Buzo と imajo ありがとう。