はまやんはまやんはまやん

hamayanhamayan's blog

ISUCON13 28位 参加記

こんいす~!
先輩に誘っていただき、Create Speedy LogicというチームでISUCON13に出てきました。
初めて出ましたが、このレベルの作問を毎年やっているのはすごいと思いますし、こんなにエンタメ性のある競技だと思いませんでした。
結果は694組中28位だったので本選出場相当と捉えるとよかったのですが、個人的にやらかしましたし、やや悔いがある所もあるので、この思いを胸に精進します。
いや、でも、賞ももらえたので結構嬉しいです。
ISUCON13 受賞チームおよび全チームスコア : ISUCON公式Blog

2023-11-26更新 最終順位が変動したので修正

今年のお題について

動画がすごすぎて中身が頭に入ってこなかったが、動画配信サービスを高速化する問題。
しかも、得点は投げ銭の合計点!笑
何をやってもいいから顧客にお金を落とさせることができれば正義という金網デスマッチが今ここに始まりました…

今回面白いのは、DNSサーバもチューニング対象に入っており、そこにDNS水責め攻撃が来るというシナリオが待っています。
過去問はいくつかやってから本番に臨みましたが、このようなDoS攻撃を回避するチューニングというのは初めてだったのでびっくりしました。

チームの中で自分がやったこと

自分がやったことだけを書いておきます。

  • [10:00] インフラ作成やベースライン構築などの初期作業はチームメンバーにお願いして、マニュアルを読んだり、ソースコードを端から端まで読んで改善策案を出していました
  • [12:19] TagsテーブルをApp側に固定値で配置し、ついでに、使用していた所のN+1を解消
  • [15:08] FillLivestreamResponseがN+1状態で呼ばれていたので解消
  • [16:33] getUserStatisticsHandlerのN+1解消

他にもいくつかN+1の解消をしたり、他のメンバーが作ってくれたキャッシュを入れ込んでみようとしましたが、性能に直結しなかったので入れずに終わりました。
時間込みで書き出してみると手が遅すぎる…精進…
28位まで行けたのは、最初のインデックス張り方がかなり良かったこと、キャッシュ戦略と手際が完璧だったことが要因だと思います。(自分は全くやってない)
自分がやってたようなN+1改善は誰もがはっきり分かる所だけれど、上の2つは経験値の違いを感じましたね。
app改善についてはチーム協力してまんべんなくできていたように思いますし、最終的にサーバ1台構成でfinishしました。

チームの中で自分がやらかしたこと

ええ、分かっています。参加記で聞きたいのは成功体験ではなく失敗体験であるということを。

  • ソースコードを端から端まで読む必要性はなかったかもしれない。1時間弱で読み終えることはできたし諸問題もそれなりに発掘できたような気もするが、普通に遅い所の処理から手を付けるのでその時に辿っていけば分かるし、最初のソースコードの深読みが甘かったり、DBと突合して考える所も多く、時間的にも負荷起因でやればよかったと思う
  • ここが大反省ポイントだが、17:00頃にDNSの別サーバー化を企てた際に各サーバでキャッシュが残っていたのか原因ははっきりしてないが、名前解決エラーが出てしまい3台中2台が動かないという事態になってしまった。自分の知識不足というか見切り発車が原因なのだが、これがサーバ分割が間に合わない一因となってしまい大変申し訳ない…(しかも、単にappとdnsを分割してもレコード更新を頑張る必要があり、結局間に合わなかった)
  • golangコンパイラに怒られすぎ問題。累計すると1時間くらいはgolangコンパイラの修正指示に従っていた気がする。言語系の素振りもやりましょう

終わりに

とりあえずギリギリ本選圏内の28位までこれてよかったです。
ISUCON13という長い歴史があり、過去の回の体験記が大量にあるおかげで色々勉強させていただきました。 コミュニティや誘っていただいたチームメンバーに感謝するとともに、来年も頑張りますという気持ちです。