ブログ・ア・ラ・クレーム

技術的なメモとかライフログとか。

ISUCON8 に参加して最終成績が本戦3位だった

タイトルのとおりです。何やかんやあり ISUCON8 の予選を無事突破した後に 10/20(土) LINE さんのオフィスにて本戦に参加して、最終成績 3 位に収まりました。 3 位だと特に表彰されるわけでもなく気持ちのみなのですが。

チーム構成と役割分担について

職場のよしみで cubicdaiya さん、 catatsuy さんと何らか SRE チームらしき雰囲気を醸し出しながら参戦しました。 大枠としては以下の役割分担を組んでいました。

  • インフラ担当
    • cubicdaiya
  • アプリ担当
    • catatsuy
    • syucream

全体チーム構成やツール・環境構築お膳立ては catatsuy さんがいい感じにやってくれていました。

予選について

本記事執筆にあたり予選実施日と期間が空いて、ほぼすべての記憶を損失しました。 様子はたぶん catatsuy さんの以下記事にある気がします。

medium.com

本戦について

だいたい出題された課題の要点は以下記事で説明されています。

isucon.net

3 位に入賞できた決めては突出したコレという点は無く、チームでそれぞれ貢献できた、バランス的には良い塩梅なのではと感じました。 具体的なタイムラインとしては覚えている限り以下のとおりです。

前半: 好調な滑り出し

  • とりあえず各々初期準備をする

    • 自分はここでは DB スキーマを取り出して共有したり WebUI 調べたり
  • catatsuy さんが早期にログ分析APIの叩き方問題に気づく

    • 着想としてはrate limitとかより重要なパスでI/Oしていそうなことがやばそう
    • 11 時台に議論して、ハマりそうだから手を打とうと結論づけて catatsuy さんが着手しだす
  • syucream が LIMIT 1 問題に気づく

    • 最初はサブクエリ書く感じで改善したが LIMIT 1 するのと課題的に差分がそれほどなかった
    • ここで一時的に 5000 点ほどスコアを叩き出しトップに躍り出る
    • 時間軸が入れ替わるが、この改善の実施直前に cubicdaiya さんが slow query を出してくれていてプロファイルの裏付けもした上で実施した
  • cubicdaiya さんがインフラ周り、特に nginx 周辺のチューニングを徐々にする

    • 冗長そうなコンテナ化をやめる
    • 静的ファイルを nginx で配信

中盤: 次ステップへの到達との葛藤

  • 会場提供でランチとして弁当が出る

    • AbemaTV のニュースで鯖の漁獲量が減って値段が若干上がった話を思い出し、僕は思わず鯖味噌煮弁当を確保
  • catatsuy さんのログの集約送信が動き出す

    • send_bulk API の利用がうまくいかず、時間ももったいないのでバッファリングして send するだけにとどめたり
    • この瞬間はスコアに響かなかったが、後々ボディブローのように効いてきた感じがある
  • syucream が地味に無駄そうな user table のレコードロックを外す

    • slow query ではあったが、全くスコアに響かなかった
  • cubicdaiya さんがそろそろいいでしょと良い SNS share 機能を有効化する

  • syucream が雑にロウソク足チャートのオンメモリキャッシュを入れる

    • マージした後に、一度キャッシュをすると別タイミングに対してのクエリにもキャッシュヒットしてしまうバグに気づく
    • が、ベンチマーカが文句を言わなかった!
    • 一瞬チームで相談して、問題が出てないなら後で考えようと結論づける
  • cubicdaiya さんが複数台構成を考え始める

    • 特に異論無く、 1: DB, 2: App, 1: nginx という意思決定が即なされる

後半: 着眼点は悪くなかったがもう一歩だったか

  • catatsuy & syucream で orders & trade の課題について考え出す

  • その裏で cubicdaiya さんが App サーバを 2 台構成にしていた

    • このあたり?でスコアが 10000 近くに到達
  • catatsuy さんがミクロな最適化したり、 syucream が銀行 API アクセスを並列化したり N+1 を無くそうとして爆死したり

  • その裏で cubicdaiya さんが 4 台フルに使い切る構成への移行を追えてチューニングに入ったり

  • DB の負荷をさげたくて ORDER BY を使うクエリを Go のアプリレベルに移植して時間がたりなかったり

  • 一部さばけない負荷に対して cubicdaiya さんが async sleep 入れたり

    • syucream はこれが大きな差別化ポイントだった気がしている

そうこうしている間に 17:50 頃になって収束させて終了

'もう一歩' に対する所感

  • 着眼点は非常に良くて、 PARTITION に対する疑惑や POST /ordersRunTrade() 最適化は課題に感じていて一部取り組んでいました
  • あらかじめ配布された spec を読み込んだり、外部 API に対して向ける疑惑がもっとあっても良かったかも

結論: ISUCON はいいぞ

今回の出題の外部 API が絡む話は個人的によく練られていて、個人的に非常に好ましい話でした。なぜならこういう外部APIとその挙動の差異は現実問題に起こりうりそうな話だからです。 そういう観点から言うと、学生チームが優勝したという展開はとても興味深いようにも思えます。 個人的課題として、自分が当日見ていた箇所で見どころは誤っていないけど一歩足りなかったことが挙げられ、狂おしいほど悔しいです。

もし次回参加して同じメンバーでチームを組むのなら、 catatsuy さんが優勝するのに並々ならぬ熱意を抱いているのでたぶん僕らが優勝するでしょう。