今年もISUCONに参加しましたが予選で敗退しました.末筆ではありますが本エントリを反省文としてしたためます.
今年も #isucon の予選に参加しましたが敗退しました.昨年一昨年に比べてスコアをそこそこ出せた点は良かったけど…
— Toshiya SAITOH (@stoshiya) 2020年9月12日
個人としては今年で4回目の参戦となります.昨年までのメンバーとは異なり,@noda_sin, @opeの3人で参戦しました.2名とは前職の元同僚で,3人とも新規事業開発に従事していましたが,どれも尽く終わったので,チーム名はサービス:ターミネーターとリーダが命名してくれました.
今年はコロナ禍の影響もあるので,3名とも自宅からリモート参戦にしました.事前準備はMicrosoft Teamsでの接続確認を少ししたくらいで,あとは各々で.
予選当日の朝はやや緊張していたのか5時頃に目が覚めてしまい,少し素振りをしたり,ご飯炊いて出汁ひいて味噌汁作ってとしっかりめの朝食を摂ったりしてから自宅デスクに戻ったら,予選スタートが2時間スリップしていました.500チームに3インスタンスずつ(実際は踏み台ホストも含めて4インスタンス)用意しているので,運営は毎年大変でしょうね.ISUCONの風物詩みたいなものでしょう.
isucon予選あるあるですねw https://t.co/rGMEk1Hf5d
— Toshiya SAITOH (@stoshiya) 2020年9月12日
12時20分に予選がスタートしてから,レギュレーションとソースコードを手分けして読みました.インスタンス3台にはnginx, web application, mysqlが動いている状態でした.例年に比べてとてもシンプルなのですが,今思うと非常に奥深くて素晴らしい課題設定だったなと.我々がやったことを以下に箇条書きで挙げておきます.どれも小手先のことで,今回のベンチマーカーのスコアをあげる箇所までには届いていなかったのだと思います.
- NFSで静的ファイルを共有
- nginxのアクセスログを解析するツールのセットアップ
- Server1はnginxとapp,Server2はappとmysql,Server3はappのみにしたが,あまり効果なかった
- 静的ファイルは最初からnginxで配信するように設定されていた
- 静的ファイルの画像はPNGだったため圧縮してもサイズ変わらず
- Botからのリクエストは一部を除いてnginxで503を返すように設定
- ナゾっての検索クエリのN+1は対処
- SQLの検索コストの高そうなところにインデクシングしたが,初期化スクリプトに入れ忘れていた(対応してくれたメンバーへの伝達漏れ)
- 初期化のためのWebエンドポイントはmysqlを動かしているServer2に向くようにnginxで設定
- redisをインストールしてキャッシュしたが,なかなかスコアアップには至らず…
予選の途中でメンバーがServer3のiptableの設定をミスってSSH接続できなくなりました.初期設定でsshdがIPv6でもListenしていたので,IPv6リンクローカルアドレスでping6に返事をするものからServer3を探し出し,IPv6経由でSSH接続してなんとか難を逃れました.20年前にIPv6のことばかりやっていてよかったなと思いましたw
今年も(辛く)楽しい濃密な8時間を過ごせました.運営のみなさまには感謝しかありません.ありがとうございました.
ISUCON7本戦,ISUCON8予選,ISUCON9予選とスコアゼロ続きの悪夢だけは回避できた点だけは多少前進したと思います.また来年も参加したいですね.もう少し結果を出せるようにSQLとRedisを勉強しておこうと思います.