名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

ISUCON13参加記録(割とうまくいかなかった感)

久々にあまりうまくいかなかったなと思う回でした。悔しい。 チームとしての見解ではなく、個人としての見解であるためご了承ください。 最終的には7500点くらいだった記憶です。(スクショ取り忘れた)

追記:リポジトリを公開しました

https://github.com/yumechi-mosmos21-pxfnc/isucon13

活動としての振り返り

申し込み

今年も自分が対応しましたが、例年にも増して申し込みが多く、申し込みのタイミングで予定空けられたのはラッキーでした。 対策的なことは何もしてませんが、事前にチーム名など大体入力することは決めてたので良かったです。

事前準備

1か月くらい前から ISUCON のために設定ファイル周りを用意。 ちょっと今年はチームメンバーの仕事の負荷が高めな時期と被ってしまった感じがあり、タイミングが悪かったかもしれないです。 (自分も自分で PyCon APAC, 技術書典15とかなりカツカツなスケジュールでした)

用意した設定ファイルはこのあたり。 設定ファイルは pxfnc さんがいい感じに Makefile で配置してくれるようにしてくれてました。

また今回解析ツールとしてはこの辺りを使いました。 これらを Docker で動くようにして置き、ローカルの環境構築の手間を省きました。

  • pt-query-digest
  • alp
  • kataribe

それ以外については Rust でいきましょうとか、MySQL以外来たらあきらめましょうとか、そんな話をして終わり。 OpenTelemetry でのトレースをやりたかったのですが、どうも Rust でうまく動かすための知見が足らずチームとして断念しました(自分は NewRelic のアカウント作ってなかなか来ないねーってやってただけで実装は mosmos21 さんや pxfnc さんにおまかせ)。

当日

起きれたというか、前日仕事が割と大変だったこともあり自然と目が覚めて状況確認してたというか…。 起きるのは余裕でしたが、朝時点でも若干疲れを感じていました。

9:40 くらい

どんな問題が来るんだろうねーって話をしていて、ドンピシャで動画配信サービスはやだなーできる気しないなーって言ってたらまさかの動画配信サービスでした。 サムネイル?!動画のチューニング?アセット!?!みたいなことを考えていましたが、そのあたりは実は不要だったようです。

実は自分の頭の中で YouTube とか Twitch とかの動画配信サービスどう作るんだろなみたいなことをふわっと考えたことがあって、現実的なラインで考えられんなと思ってた矢先だったので、なんか不思議な感じでした。

10:00 くらい

開始して Cloud Formation でインスタンスを作成しましたが、普段UIを英語にしている関係でマニュアルで説明のある日本語に戻す必要がありました。 普段慣れてないから仕方がないね。 また構築も上から最新のものが並んでいると思わず、したばかり見てまだ PROGRESS かぁと思ってしまいました。 (これは自分のミスです、普段からバッチシステムとか見てるので上から下に最新のログがあると思っちゃってたんだよなぁ)

で、内容を確認していき PowerDNS …? 水責め…? なんだこれ…? となりました。 とりあえず最初はこんな感じの分担。

  • yumechi: ログ周りを取得して解析する
  • pxfnc: 各リポジトリのコード連携
  • mosmos21: 制約やアプリケーションコードの確認

12:00 くらい

ログを解析した結果、アイコンの取得処理はやばそうだなということがわかりました。 あとは結構 N+1 が多いことがわかり、地道につぶす? という話をしつつ、 DNS... となっていました。

またアプリケーションの分割をやっていたのですが、うまく DB のサーバーが見つからないみたいな状況が続き、苦戦していました。 例年は1時間以内には終わっているのですが…。

15:00 くらい

自分がテーブル構造見ながらインデックス張ったりしてチューニング、mosmos21 さん、pxfnc さんがアプリケーションコード周りの改善に入っていました。 雰囲気で Rust は読めるんですが、実際に書こうとすると詰まりまくりで自分は戦力にならないと思い、インフラ周りを中心に見ていくことにしました。

17:00 くらい

結構ぎりぎりまでアプリケーションコードの N+1 を修正していきましたがスコアがあまり伸びませんでした。 1万超えたり超えなかったりしていたのですが、最終的には7500点くらいだった記憶です。(1回少しだけ高く出たのですが、ログ見ている感じ DNS 水責めがたまたま起きなかったらしく、ちょっと運が良かったかもしれません)

そうそうに解析が終わり、自分がやることなかったので今年は早めに Nginx, MySQL のログを停止しつつ、最後にインデックスをいくつか張りなおして終わりました。

念のため再起動試験をぎりぎりにやったのですが、 Nginx が自動起動になっておらず一瞬0点になったので本当にヒヤッとしました。 やってよかったです。あと今年のアプリケーションは再起動が早かったかも。

反省

適当 KPT です

  • Keep
    • 事前に解析ツールを Docker で動かせる状態に持っていったのはよかった、解析しやすかった
    • ついでに解析用のログを落としてくるための shell スクリプトも用意したがこれも解析に役立った
    • 事前に設定ファイルを用意しておいたのはよかった
      • いくつかのチームで公開されているリポジトリとか回りながら考えていた
    • 初手の解析は割と手早くできたのでよかった
      • 問題点は早めに洗い出せたと思う
    • alp のオプション結構いい感じに使いこなせた
      • リクエストある程度まとめられることを協議中に mosomo21 さんから教えてもらった
    • Copilot があったので楽だった
      • コード書くのサジェストしてくれるのである程度動きそうなコードが提示される
      • create table についてもサジェストしてくれるため、インデックス名を決めることがなく楽だった
    • SQLでこの辺さっと出せたのはよかった
      • select SUM(LENGTH(image)) from icons; で画像のサイズを出せた
      • select sha2(image, 256) from icons; で画像のハッシュを出せた
    • CPUネックなのはすぐ気づけた
    • Dockerはがし練習しといた
      • 今年出なかった~~~~~~~~~~うおおおおおおん
    • 初手で今日のタイムスケジュールを大体決めたのはよかった
      • 再起動試験するぞ!とかこれくらいになったら新規コード入れずにフリーズするぞ!とか
  • Problem
    • きつい時期にかぶってしまい体力的、精神的に万全ではなかった
      • 仕方がない部分もある、表で話せることでもないので割愛
    • トレースのビジュアライズツールは使えずじまいだった
      • NewRelic 活用できなかったということ
      • OpenTelemetry に対してのそもそもの知識も足りなかったので反省です
    • 目に見える課題を先に解こうとしたのは完全に握手だった
      • DNSに手を付けるべきで、Rust書く戦力にならない自分がそっち見ればよかった説
      • N+1 はわかりやすいが、そこにとらわれすぎ
      • チーム方針としての判断が遅かった
    • インデックス張るの遅すぎ
      • ある程度明らかにインデックス貼ればいいところがあった
        • user_id とか created_at とか livestream_id とか
      • SlowQuery のダイジェストを確認していたが接続がうまくいかないなどで補助に入っていて忘れていた
    • Rust 思っていた以上にかけない
      • これここにうまく書くのが難しいんだー的な奴が結構あって手が出しずらかった
      • これは個人の反省ポイントです(勉強する時間が取れなかったという問題…)
    • DNSの問題と向き合っていない
      • どうすればよかったのかわからないが、ある程度フィルタするとか、ツールの使用とか動きを知ってみてチューニングするとか方法はいくらでもあったはず
      • 挑戦してだめだーっていう方がよかった、N+1 に見えている問題を解こうとしすぎていたのはよくなかった
      • 感想戦を見て話にあんまりついていけてない
      • DBもDNSのものだけ分けとくとかできたよね、とかは本当にそう
    • 初回しか成功しない負荷走行試験がまあまああった
      • これはチームの実装ミスでオンメモリに持ったデータがそのまま残ってしまうバグを埋めてしまい、カウントに不具合があったためです
      • 原因の判明が遅れたのも痛かった
  • Try
    • 少なくとも今回の範囲のDNS周りのあれこれは理解する
      • 知らなさ過ぎた
    • トレーシング周りを何とかする
      • OpenTelemetry についての知見を増やす
      • Rust以外でもできるようにしたい事情がある
    • 勉強の時間をとる
      • はい

割と今回をふりかえってみると、Rust書くほうは任せてインフラ全部りしておいたほうがよかったと思いました。 あと N+1 みたいに見えている課題を解くことが本当にスコアアップにつながるのか? そういったところの判断ができていなかったので、この点も反省していますし、自律的に動けるメンバーが多いからこそアイディアを早急に出してその場で考えていれば、と悔しい部分が多かったなと思います。

今回は力不足を強く感じたので、今後に向けて選択肢を増やしていきたいと思います。

まとめ

今年も楽しい問題でまさか当日に結果発表まで出るとは思いませんでしたし、運営の方に感謝です。

今年はチームとして反省点が多いように思いましたが、それでも事前準備としてできたことも多く、毎年やっているような活動については割と早くできました。 (DB連携だけてこずっていたので、これは反省点ですが… IPの解決がよくわからないことになることがあり…)

来年以降も参加できればという気持ちですが、日程次第という感じです…(人生でやらないといけないことも増えてきているので)。 毎年毎年問題に挑むことによっていろいろな手法や学びがある ISUCON は続いてほしいという気持ちがあり、もし参加できなくても応援は続けたいなと思います。

今年もありがとうございました。