ISUCON11に参加しました

こんにちは @0daryoです。

8/21に行われたISUCON11に参加してきました。

初参戦で自分たちなりに準備してきたつもりだったのですが完敗しました。 とても楽しく競技できたので運営の皆さんには感謝の気持ちでいっぱいです。

覚えているうちにやったことなど記録しておきます。

題材

ISUCONDITIONというサービスが題材でした。

椅子が擬人化(ペットに近い?)されてそのコンディションについて確認していくというような内容です。

マニュアルを読む時間を作っていたのですが、要件にあったチューニングをできる段階まで行けませんでしたorz

ISUCON11 予選問題 - YouTube

チーム

「賢者のつどい」というチーム名で大学時代の友人である @Panda_Programと参加しました。 主に分担として以下のような形で考えていました。 僕自身は仕事でもサーバーサイドをやっているのですが、Pandaさんはフロントメインであるためこんな感じです。

  • 僕: Goアプリ, DB
  • Panda: nginx, 監視

その他二人で適宜担当

事前準備

7月と8月に一度ずつ事前準備をしました。 主にISUCON9予選問題の環境を再現して練習していた気がします。 やったこととしては

  • MySQL
    • slow query
    • index
  • nginx
    • log解析
    • gzip圧縮
    • キャッシュヘッダ調整
  • 監視
    • netdata
    • htop
    • new relic
  • trace
    • appとnew relic繋ぎ込み
  • app
    • pprof

この時主に監視などサーバー・アプリの状態を知る練習はかなり行っていたのですが、そこから次のアクションをどうするかという練習があまりできていませんでした。 それがもろに予選で何もできなかったことにつながったので来年こそは実装力を高めて臨みたいです。

当日

9:00~

  • 集合
  • オープニング動画を見る

10:00~

  • マニュアルを読む
  • 最初のベンチを回す

3500台でこの値がしばらく最高値となり苦しめられることになります

11:00~

  • New relicでの外形監視・トレースを設定する
    • POSTリクエストが支配的になっていることを確認
  • slow query logの設定
  • htopでリソース状況の確認
  • ボトルネックになる部分確認
  • deployフローの確認

いろいろなモジュールを入れたのでスコアが1000台になりました

ここまでは練習の通りにできているつもりでした。

12:00~

  • nginx関連の設定を入れる
  • POST /api/condition/:jia_isu_uuidボトルネックになっていそうなので確認
    • insertを一括でできるように変更
    • 遅延が許されるため非同期書き込みに変更

13:00~17:00

  • GET /api/trend
  • GET /api/isu
    • N+1クエリを解消しようと試みるもfail連発
  • transactionが必要ない場所を消す
  • indexを貼る
    • isu_condition.jia_isu_uuid
    • isu_condition.timestamp
    • isu_condition.jia_user_id

アプリ側で考えている実装を入れ切れることができず、焦り他の施策を考えたり実行する余裕がありませんでした。 圧倒的な実装力不足です。

17:00 ~

  • 相変わらずスコアは1000台で敗北ムードが漂う
  • 監視系モジュールを外し終了に備える

このタイミングでベンチマーカーが503を返すようになったため競技時間が延長となりました。 ベンチーマーカー復活後終戦感が漂っていたのですが、一応最後に回してみると個々の施策はある程度効いていたようで、17000台のスコアが出てテンション爆上がりしました。 (ちなみに16時台で10万超えているチームもいる状況ですw)

どうやらnew relicへのpushを毎APIで行っていたことがスコア低迷に大きく影響していたようです。

~19:00

競技終了まで相変わらずアプリ側の修正を行っていたのですが、決定打もなく最高スコア17900くらいでフィニッシュしました。

8/22 14:00

結果発表 最終スコアは16680で249位でした。

isucon.net

感想

実装力がないせいでなぜかfailするという状況を抜け出せず、 こだわり続けてしまったせいで他に思いついていた施策を一切試せませんでした。 特にsqlxなど生に近いクエリを書く練習が特に足りていなかったと感じています。 インフラ面についてもぱっと3台のサーバーを活かせるような構成を撮れればよかったのですが、CPUがパツっていることを確認しつつもアクションには移せなかったので反省です。

逆に準備していた監視・ボトルネックの特定についてはある程度できたのかなと感じています。

総じて準備が超大切ということを身をもって実感しました。 9時間近くめちゃくちゃ集中して楽しい時間だったので、運営の皆さんへは感謝の気持ちでいっぱいです。 また来年修行して出直してこようと思います。 @Panda_Programお疲れ様でした!