ISUCONを解いて考える、AI時代のオブザーバビリティ活用

Observability 山村 悟史

昨今、AIを使ってアプリの解析や改修を進める場面が増えています。一方でAIが調べるだけで十分なのか、オブザーバビリティを用意する意味はどこにあるのか、という疑問もあるのではないでしょうか。

この記事ではISUCON14に対してAIで調査、改修を行い、Splunk Observability Cloudで何が見えたかを解説します。あわせて実際に計装して試した結果とその計装をAIに任せるポイントをご紹介します。

ISUCONとは?

ISUCON(Iikanjini Speed Up CONtest)は、お題として与えられたWebアプリを決められた時間内に高速化してスコアを競うコンテストです。

高速化の対象はアプリのコードだけではありません。データベース、Webサーバー、ミドルウェア、OSの構成まであらゆる箇所が対象になります。そのため、どこが遅いのかを素早く正確に特定できることがスコアに直結します。

過去のISUCONでのボトルネック傾向

過去の出題を振り返ると、ボトルネックになる箇所はいくつかのパターンに分かれます。

注目したいのは、これらが「アプリのコードだけを見ていても分からない」ものを多く含むことです。プロセスの外側、DBの内側、ネットワーク、外部APIなど複数の層にまたがっています。

オブザーバビリティで何が見えるか

Splunk Observability Cloudはフロントエンドからバックエンド、インフラまでをトレース、メトリクス、ログでつなげて可視化します。ISUCONの詰まりどころに当てはめると、次のように見えます。

機能
何を可視化するか
ISUCONでの見え方
データの取得方法
APM
アプリのレイテンシー、エラー、トレース、DBクエリのレイテンシー
1本のトレースに同じSELECTが並ぶ(N+1)。外部APIの待ち。接続プールの待ち
アプリへの計装(OpenTelemetry)
Infrastructure Monitoring
ホスト、ミドルウェアの健全性
プロセス別のCPU。MySQL、nginxの接続数やロック待ち
OpenTelemetry Collector(hostmetrics、MySQL、nginxなど)
Database Monitoring
DBの負荷、上位のクエリ、クエリの実行計画
合計時間の大きいクエリ。インデックスが使われているか、フルスキャンになっていないか
OpenTelemetry CollectorのMySQL receiverなど
ログ
アプリ、ミドルウェア、OSのログ
スロークエリ、nginxのエラーログ
OpenTelemetry Collector(File log receiver)など

ポイントは、これらが別々の画面ではなくつながっていることです。例えば「アプリが遅い」ときにトレースで遅い処理を特定し、同じ時間帯のホストやDBのメトリクスを重ねて原因が絞れます。過去のISUCONで言えば、アプリ外のプロセスがCPUを使っていたケースはアプリのトレースだけでは見えません。プロセスのCPUと並べてはじめて分かります。

ISUCON14で試してみた

ISUCON14で使用されたアプリ及び問題はこちらから利用できます。

ISUCON14の構成はこのようなものでした。

椅子のライドシェアを模擬したアプリケーションで、いかに処理を高速化しユーザー満足度を維持するか、を競うものとなっています。

公式の本戦とは条件が異なりますがサーバーはアプリ1台で立ち上げ、実際にGoの実装を計装してSplunk Observability Cloudで見てみました。

なお、計装およびコード改修はコーディングエージェント(Cursor)を使用しています。

計装をAIに任せる

今回、AIと一緒に次の作業を進めています。

AIにプロンプトで対象ホストの情報やSplunk Observability Cloudの接続先情報などを与え、計装は全てお任せしました(アクセストークンの管理については環境変数にして渡すなどしてご注意ください)。

Goについて補足すると、アプリケーションレイヤーのオブザーバビリティを始めるにはデータを取る準備(計装)が必要です。計装は大きく自動計装と手動計装に分かれます。

一般的にはJava、Python、Node.jsのように起動時にエージェントをアタッチできる言語であれば、まず自動計装を試し、必要に応じてコードに手を入れるのが手軽です。一方でGoは単一の静的バイナリーにコンパイルされるためアタッチする先がありません。選択肢は次の3つです。

今回は計装ライブラリと手動計装を使いました。ISUCONのような詳細な調査が必要な場面では取りたい粒度に合わせて手動で補える点も利点です。

インフラ、ミドルウェアのメトリクスについては、ブログ「Splunk OpenTelemetry Collectorでホスト、NGINX、MySQLを可視化」で詳しく解説しています。

Goへの計装、Observability Studioについては、ブログ「Splunk Observability StudioでGoアプリケーションを効率よく計装する」で詳しく解説しています。

Splunk Observability Cloud

無事計装完了

計装の結果見えたもの

以下は筆者の環境での検証です。

データベースのIndexがされていない、N+1問題の対処といった基本的なボトルネックの他に、トレースを見ると次の3か所で原因が確認できました。

1. 評価の処理が決済APIの待ちの間、接続を持っていた

評価のトレースの大半は、外部の決済APIの待ち時間でした。最も遅いSQLでも約9msで、SQLを速くしても効果がありません。読み取りのトランザクションが決済APIを待つ間ずっと接続を持っていることがトレースから読み取れます。

トランザクションを決済の前に閉じるように直したところ、53192点が56925点になりました。この改修は公式の解説には書かれていなかったポイントです。

2. 座標の応答がDBの書き込みを待っていた

ライドシェア対象の椅子の座標を送るAPIのトレースは約297msで、時間の大半はINSERTと状態の更新でした。座標の応答が遅れると、椅子が次の移動を始めることができません。

3. 通知のトレースは長いがSQLは速かった

通知のトレースは約487msでMySQLのスパンが約18本並列に並んでいました。中心となるCOUNTのSQL自体は0.27msで、これ自体がボトルネックではありません。時間を使っていたのはDBの接続プールの待ちでした。SQLの文だけを見ているとCOUNTを疑ってしまいます。トレースとDB接続プールの指標を合わせて見ることで、原因が接続の待ちだと確認できます。

その他にもインフラのメトリクスなども参照しつつコード改修を行っていきました。

なお、Splunk Observability Cloud向けのMCPサーバーを使うと、AIがオブザーバビリティのデータを直接参照できます。例えば「前回の走行と今回の走行で、エラー率が増えたAPIはどれか」とAIに尋ねて、オブザーバビリティのデータから答えてもらう、といった使い方ができるようになります。

参考:Splunk MCP Server for Splunk Observability Tools の設定

結果として、初回は903点で最終的に59657点まで進みました(これはほとんどAIの成果です)。

なぜオブザーバビリティか

AIによる直接取得との違い

AIに「いま何が遅い?」と聞いて、サーバー上のログやプロセス、スロークエリ、実行計画をその場で取ってもらうのはとても速い方法です。思いついたらすぐ聞けるため個人で進めるときには非常に便利です。

もしかすると、AIが直接取得できるならオブザーバビリティは要らないのではと思われるかもしれません。確かに1人で取りに行ける範囲の情報であればそれで足ります。

一方でオブザーバビリティには別の価値があります。

AIがサーバーから直接取得
オブザーバビリティ
強み
思いつきですぐ取れる
チーム全員が同じ画面で同じ状況を把握できる
記録
担当者のチャットの中
過去情報も残るため、変更の前後を比べられる
見える範囲
取りに行ったものだけ
アプリ、DB、プロセス、ホストを同じ時間軸で見られる

ISUCONはチーム戦です。誰かが「DBが重い」と言い、別の人が「アプリのCPUが高い」と言うといったすれ違いが起こりがちです。同じ画面で同じデータを見ていれば次に何を直すかの議論が速くなります。

また、変更の前後のデータがそのまま残るのもオブザーバビリティの良いところです。「この改修で何がどう変わったのか」をトレースやメトリクスというエビデンスで示せます。AIの速さとオブザーバビリティの共有性はどちらかを選ぶものではなく組み合わせて使うものだと思います。

今後のISUCONでは全体像と依存関係が必要になるかもしれない

ここからは筆者の推測です。

これまでのISUCONのアプリはnginx、アプリ、MySQLといった、どちらかというとモノリシックな構成が中心でした。一部の回ではアプリ外のDNSサーバーや内部のマッチング処理、外部APIが登場しましたが、アプリ本体は1つのプロセスでコードを読めば全体を把握できる規模でした。

昨今のアプリケーションのアーキテクチャを考えると、今後はもう少し複雑な構成のアプリが出題されるかもしれません。例えば複数のサービスに分かれたアプリ、サービス間の非同期のやりとり、キューやキャッシュ、複数の外部サービスの組み合わせなどです。

そうなるとコードを読むだけでは次のようなことを把握するのが難しくなります。

こういったものについて、実際に動かしたときのトレースとそこから自動生成されるサービスマップで一目で見られるようになります。AIにコードを読ませることも有効ですが、実行時の呼び出し関係と待ち時間はオブザーバビリティのデータで確認する方が確実です。さらに、チーム全員が同じサービスマップを見ながらどこを直すかを相談できます。

アプリが複雑になったとき、全体像と依存関係を見るための手段が必要になります。オブザーバビリティはそのための手段として有効です。

補足:計装にもコストがかかる

一点、注意が必要なことがあります。それは、計装そのものにもCPUやメモリの負荷がかかるということです。

ISUCON14ではSQL、ランタイム、決済APIのスパンを常時入れた状態でスコアを測ったところ56925点が50412点に下がりました。筆者の環境ではギリギリのスペックで動かしていたせいか、CPUが高騰していました。

ISUCONのようにスコアを最優先する場面では次のように使い分けるのがおすすめです。

環境変数で送信を止めてもミドルウェアの呼び出し自体は残ります。Database Monitoringのクエリサンプルの取得もDBへの問い合わせとPerformance Schemaの有効化を伴うため、同じように外すのが安心です。最後の最後にスコアを測る際は計装を全部外すと良いでしょう。

ただしこれはISUCONのような特殊な状況でのみに言えることで、本番環境では常に観測できるようにしましょう!

まとめ

本記事では過去のISUCONで詰まりやすかった箇所を整理し、Splunk Observability Cloudで何が見えるか、ISUCON14で実際に試した結果とあわせて解説しました。

まとめとして、オブザーバビリティにより次のようなメリットが得られます。

  1. 層をまたいだ原因の特定:アプリのトレース、DBの接続や実行計画、ホストのCPUを同じ時間軸で見られるため、アプリだけでは見えない原因も調査できる
  2. チームでの状況把握と変更の前後のエビデンス:AIの直接取得は速く、オブザーバビリティは全員が同じ画面を見られ、変更の前後のデータも残る。両方を組み合わせて使うべき
  3. 全体像と依存関係の把握:アプリが複雑になっても、トレースとサービスマップで、呼び出し関係と待ち時間を確認できる
  4. 計装の立ち上げ:Goのように手動計装が必要な場合でも、AIと進めることで負担を下げられる

AIによる計装とオブザーバビリティの活用をぜひお試しください!

次のステップ

関連記事

NoOpsの基本:NoOpsとDevOpsとの比較
オブザーバビリティ
6 分程度

NoOpsの基本:NoOpsとDevOpsとの比較

IT運用や開発を自動化するアプローチであるNoOpsを紹介します。 NoOpsとは「No Operations(ノーオペレーション)」からきており、このアプローチの仕組み、メリットと課題、そしてこれがDevOpsから進化したものなのか、あるいはDevOpsの終焉を意味するのかについて探ります。
外形監視とは?
オブザーバビリティ
13 分程度

外形監視とは?

外形監視の目標は、組織が運用するWebサイトでユーザーが実際にどのような体験をしているかを理解することです。こちらのブログ記事では、外形監視がもたらすさまざまなメリットについて詳しくご説明します。
外形監視を正しく行う方法:外形テストでの結果の検証方法
オブザーバビリティ
6 分程度

外形監視を正しく行う方法:外形テストでの結果の検証方法

チェックすべきはページの読み込みだけではありません。適切なアサーションを作成すれば、ブラウザ外形テストで、誤検知を抑えながら、問題をプロアクティブかつ正確に検出できます。