ISUCON11 予選に参加しました

学生チーム "haigyo" としてISUCON 11予選に参加しました。
チームメンバは 双方初参加の sudamewakki です。 全員慣れてるNode.jsでの参加でした。

結果

結果は上位陣に圧倒的差をつけられ予選敗退です。

27366点

全体 165/599 位
学生 22/95 位

※ 以下を元に雑に自分で計算してみた結果なので参考値です。

https://isucon.net/archives/56021246.html
https://portal.isucon.net/teams

当日やったこと

当日はDiscordで音声常時接続で画面共有しながら参加しました。

個人

  • 全サーバのスペックを調査
    • 今回はメモリが潤沢に提供されていたのでSwap作らなくて良かった
  • 事前に作成しておいた環境整備Ansibleを走らせた
  • Appのサービスを再起動したときにTSをビルドするように修正
    • 今回はts-nodeは使われていませんでした
  • Prettier適用
  • Nginxは1番目のサーバ、DBを2に、Node.jsは1と3で受けるように設定等変更
    • ISUCON10 本戦のNode.js 参照実装ではセッション情報をNode.js側で持っていて面倒だったが、今回はCookieで持つようになっていたので単純で良かった
  • アイコンをDBから引っこ抜いてファイルとして保存、提供
    • ISUCON7 予選やっておいて良かった〜と思いましたが、リクエストが少なかったので劇的にスコアに響いたわけではなかった
    • 画像ファイルが特定のアイコンに関連するリクエストはとりあえずサーバ1で引き受けるようにした
  • 各サーバへのデプロイコマンドの作成や計測スクリプトの修正
  • POST conditionのdrop率調整
    • 他のメンバがN+1を改善してくれてDBのCPU負荷が減ったので変更がスコアに効いた
    • 最終的にはdropしないようにしたが、もしかしたらある程度dropした方が良かったかもしれない
  • POST conditionをなんとかする
    • なんとかできなかった
    • ここがボトルネックかつこの問題の核心部分だと思って、かなりの時間をかけたが実力不足でうまく動く変更を実装できなかった。悔しい
    • もっとスコアに効く変更を意識すべきだった
  • MySQL/Nginxのパラメタ調整
    • うまくスコアにつながらない物が多く、Revertしたものも多かった
  • 各種ログ、計測の無効化
  • その他チームメンバの変更に目を通した
    • 再起動試験にfailしてしまう変更を見つけられたのは良かった

チームや他のメンバ

  • レギュレーションやマニュアルを声に出しつつ全員で確認
  • 参照実装や各種設定ファイルをgit管理
  • 計測スクリプト作成
  • 計測結果を自動でGitHub Issueにするスクリプト追加
  • staticファイルをNginxで提供するように変更
  • DBにいくつかインデックス追加
  • N+1をほぼほぼ解消
  • COUNT(*) を SELECT 1に変更
  • LIMIT 1が利用できるところに付与
  • アイコンをクライアントでキャッシュ利用できるように変更
  • isu_association_configのオンメモリ化
  • conditionのBulk insert
  • その他僕が知らないところでいろいろやってくれたと思います:bow:

前日までやったこと

個人

  • チームメンバの勧誘
  • ISUCON7, 8, 9, 10予選、10本戦の練習
  • 環境整備Ansibleの作成
  • チェックリストやQ&Aなどチーム内ドキュメントの作成
    • HackMD最高

チームや他のメンバ

  • ISUCON7, 9予選、10本戦の通し練習
  • もくもく会 (平均週1)
  • 自主練
  • などなど

感想

  • 単純に悔しい
  • 純粋に楽しかった、参加して良かった
    • 多分2ヶ月前の自分では初期スコアに毛が生えた点数しか出せてなかったと思っていて、参加を決めたお陰で学ぶことは多かった
  • 組んだチームでISUCONは初出場ですが、Web/モバイルアプリ開発をやってきた仲間だったので安心してやれたのは良かったです
    • N+1やスローログの修正という重要なことを2人がガンガンやってくれて頼もしかった