ISUCON11 予選 参加記

結果

チーム「ひとは」で参加して、競技中のスコアの最高値は23308、結果は失格でした。

ISUCON11 オンライン予選 全てのチームのスコア(参考値) : ISUCON公式Blog

環境情報の確認に失敗: セキュリティグループへのルールの追加

:cry:

isucon-env-checker を実行したのは最初の一回だけだったので気付くことができませんでした。セキュリティグループは netdata 用に直接ポートを開けていました。今思うと nginx でプロキシするとかすればよかった。

チームの方針

言語選択は Node.js でした。普段 Perl を書いているメンバーもいましたが TypeScript をかけるメンバーのほうが多いためこの選択になりました。

用意されているサーバ3台について、夕方まではそれぞれのメンバーが並列にタスクに取り組みスコアを改善し、夕方以降に複数台構成にスイッチすることでリソース効率を最大化する方針を採用しました。

担当領域については明確な分担はなくお互いがなんとなくタスクを取っていました。ただ、パフォーマンス改善のアイディア出しやタスクの優先度付けは自分が行うことで全体の進行を調整していました。

開発のフローは、GitHub Project でバックログを作成、変更をブランチを切ってプルリクを作成して、master にマージする流れでした。プルリクを作るのは GitHub Project の Automated kanban のためで、特にレビューはしていません。

個人でやったタスク

  • NewRelic の有効化
    • 慣れてないのもあって使いこなせなかったです
    • 8時間という短い競技時間でうまく使いこなせてたチームはあったんでしょうか...?
    • 練習ではかなり勉強になったので良かったです
  • デプロイスクリプトを書く
    • いつもの
    • ただテンプレ化できる作業なので、事前に準備しておきたいと思いました
  • kataribe を入れる
    • いつもの
  • 静的ファイルを nginx から返す
  • 画像ファイルをローカルに保存する
    • セッションの関係で単純に nginx から返すことはできなくて、アプリから返すようにしていました
    • 結局スコアは改善しなかったのでマージはしませんでした
    • X-Accel-Redirect については知識はあったけど、うまく引き出しから引っ張ってこれなかったのが悔やまれる...
  • 複数台構成にする
    • 1台のサーバで nginx/MySQL を動かして、2台のサーバで app を動かす予定でした
    • だた、top で CPU 負荷を見ると MySQL の CPU が遊んでいたのですべてのサーバで app を動かしました

ふりかえり

競技終了直後にチームメンバーでふりかえりを行いました。その内容 + 個人的なものを書いていきます。

  • 担当分野を決めておく
    • app 担当、ミドルウェア担当的な感じ
    • 自分はもっと司令塔ポジに集中するべきだった
      • 競技後半手を動かしすぎて考える時間が足りなかった
  • ツール群はコマンド1つでインストールされるようにしておく
  • nginx とかの config はサーバごとに Git 管理するではなく役割ごとにする
    • config/isucon1/nginx/nginx.conf のように管理していました
    • config/nginx/nginx-primary.conf を管理してデプロイ時によしなに配るほうが良さそう
  • 複数台構成にするのは初手でやったほうが良かったかも?
    • 1台構成と複数台構成でのスコアの出やすさは違うので、最初から複数台構成にして仮説検証のサイクルを回すほうが正確かも
  • 1週間前ぐらいに一度集まって予行演習する
  • コア数が2だったので pm2 を導入したほうが良かった
    • そもそも pm2 の素振りもしたことがないのでやらないといけない
  • 各施策の KPI をスコアにしない
    • 何か改善を行ってもスコアに反映されないことがあります
    • これは他のボトルネックの方がスコアに対して支配的だからです
      • kataribe の集計結果やスロークエリが改善されているなら master に取り込むべきだったなと思いました
      • 他のボトルネックが解消されたときに爆発的にスコアが伸びる可能性があります
  • 前日はよく寝る

来年に向けて

チームメンバーは来年の参加も前向きだったので来年こそ予選突破を目標にがんばります。