ブログ

Kibanaはダッシュボードの読み込み時間を最大25%短縮 - その背後にあるポーリング戦略を紹介

Kibanaが継続的なポーリングとブラウザ側のHTTP/2検出を使用して、ダッシュボードの読み込み時間を最大25%削減し、HTTP/1に自動的にフォールバックする仕組みをご覧ください。

継続的なポーリングにより、KibanaのダッシュボードとDiscoverの読み込みが最大25%速くなりました。Kibanaは、定期的なチェックの合間にスリープする代わりに、HTTP接続を開いたままに維持し、準備ができたらすぐにElasticsearchのクエリ結果を配信するようになりました。HTTP/2+(9.0以降のKibanaのデフォルト)では、自動的に有効になるため、設定は不要です。HTTP/1では、Kibanaは接続プールの枯渇を防ぐために従来のポーリングに戻ります。

Kibanaがダッシュボードを読み込む際にデータを取得する方法

ダッシュボードを開くと、ほとんどのパネル(内部的には、これらを埋込と呼びます)が1つ以上のElasticsearchクエリを開始します。しかし、同期検索の単純な呼び出しと応答の代わりに、非同期検索のパワーを使います(ドキュメント)。

非同期検索では、クエリ結果が特定のHTTPリクエスト外でもElasticsearch内で利用可能な状態に保たれます。これが重要な理由を以下に挙げます。

  • ネットワークの不安定性に耐性が高く、データの読み込みを安定させます

  • バックグラウンド検索機能により、ユーザーは長時間実行されるダッシュボードやDiscoverセッションを待つ間も、Kibanaで他の作業を行うことができます

最初のクエリが送信された後、Kibanaは検索を監視して完了を検出し、結果のセットを取得します。

従来のポーリングがKibanaのダッシュボードのロード時間に与える影響

従来のポーリングでは、Kibanaはクエリを送信し、最初の接続を閉じてから、Elasticsearchの完了を定期的にチェックします。

Kibanaでの従来のポーリングを示す図。Kibanaのタイムラインには、クエリ送信後の短い接続オープン期間、それに続く長いスリープ期間、ステータスの簡単なポーリング、そして結果が表示されます。Elasticsearchのタイムラインは、Kibanaのスリープ期間の途中で完了するクエリを実行します。これは、時間のロスの原因となっている調整ギャップを示しています。

従来のポーリング戦略

Elasticsearchは、クエリ送信後に検索を完了して結果を返すまでの短い時間を設けています。もし検索がこれほど速く完了する場合、それは単純な呼び出しと応答のやり取りに相当します。しかし、長時間の検索の場合、最初の接続は切断され、Kibanaは検索の完了を定期的に確認し始めます。これはポーリングと呼ばれます。

従来のポーリングのパフォーマンス上の課題

上の図をご覧いただくと、このアプローチのパフォーマンス上の欠点がお分かりいただけるかもしれません。検索はKibanaのスリープインターバルのいずれかで終了する可能性が最も高く、そのため時間の無駄につながります。

従来のポーリングのパフォーマンスコストを示すタイムライン図。Kibanaのタイムラインには、接続オープン期間、長いスリープ期間、ステータスのポーリング、そして結果の配信が表示されます。Elasticsearchのタイムラインには、Kibanaのスリープ中にクエリが完了し、その後に赤いロストタイムセグメント(Kibanaがスリープから復帰して結果を取得するまでの無駄な期間)が表示されます。

従来のポーリングの欠点

最悪のシナリオ(検索がスリープ期間の始めに完了する場合)では、ポーリングインターバルの全期間が無駄になります。

バックオフ戦略の影響

ポーリング時にはバックオフ戦略を適用するのが標準的な方法です。これは、検索の期間が長くなるほど、ポーリングの頻度が低くなることを意味します。

クエリ期間別にKibanaのポーリング間隔のバックオフスケジュールを示す横棒グラフ。1.5秒未満のクエリは約0.5秒間隔、1.5~5秒のクエリは1秒、5~20秒のクエリは約2.5秒、20秒を超えるクエリは5秒のポーリング間隔を使用します。

ポーリング間隔のバックオフスケジュール

しかし、これはまた、検索の期間に応じて潜在的な時間損失が比例して増加することを意味します。

ポーリング間隔がノコギリ状のレイテンシパターンを作り出す仕組み

これらの要素を合わせると、失われた時間は段階的なノコギリ状の関数となります。

秒単位のクエリ完了時間に対する秒単位のロスタイムを示す折れ線グラフで、ロスタイムが上昇してから繰り返しゼロに落ちる鋸歯状のパターンを形成し、クエリの持続時間が0秒から30秒に増加するにつれて、ピークが1秒未満から5秒まで大きくなります。

クエリの実行時間によるタイムロス

ここで、ピークは最悪のシナリオ、谷は最良のシナリオを表しています。これは、従来のポーリングコストが、検索期間(およびネットワーク条件)に応じて、ゼロからポーリング間隔の全期間まで変化することを示しています。

継続的なポーリング:Kibanaが待ち時間を排除する仕組み

従来のポーリングの問題は、KibanaとElasticsearchの間にある根本的な連携不足です。理想は、Kibanaが結果が利用可能になったことを即座に認識することです。では、ほぼすべての時間をElasticsearchのチェックに費やし、待機時間をまったく設けないポーリングパターンに逆転させたらどうなるでしょうか?

Kibanaでの継続的なポーリングを示すタイムライン図。Kibanaのタイムラインは全体が青色で表示されています。クエリの送信から2回の接続更新まで、結果が表示されるまで、接続は開いたままです。スリープ期間はありません。Elasticsearchのタイムラインには、クエリが完了し、結果がすぐに配信されたことが表示されています。凡例にはロスタイムが取り消し線で示され、排除されたことを表しています。

継続的ポーリング:タイムロスに対するソリューション

長時間のポーリングとスリープ期間の廃止を組み合わせることで、結果は準備ができ次第すぐに提供されます。

HTTP/1の陳腐化

その理論は堅実なものです。では、継続的なポーリングをオンにすると、なぜこのKibana導入はそれほど陳腐化して見えるのでしょうか?

Sample Logs Dataデータセットを読み込むKibanaのダッシュボードの動作画面録画で、複数のパネルが順番に表示されます。これには、レスポンスコードの時系列、米国の総リクエスト数を示す地図、ユニークビジター数、HTTPエラー率の指標、そしてマシンのOSと宛先データのサンキーダイアグラムが含まれます。

継続的ポーリングは、HTTP/1で接続しているクライアントのパフォーマンス低下を招きます。

重要なのは、この導入がHTTP/1上で実行されていることです。HTTP/1では、HTTPリクエストはTCP接続に1:1でマップされます。そのため、複数の長時間にわたるポーリングリクエストがブラウザの限られた接続プールを占有し、他のリクエストがキューに溜まってしまいます。

一方、HTTP/2+では、ネットワークリクエストは多重化によってTCP接続を共有できるため、この問題は発生しません。

Kibanaの継続的ポーリングにおけるHTTP/1とHTTP/2を比較した図。HTTP/1では、リクエストごとに1つのTCP接続が必要で、6つの接続でブラウザの接続プールを使い果たします。HTTP/2は、1つのTCP接続で複数のポーリングリクエストを多重化し、プールの枯渇を防ぎ、パフォーマンスを維持します。

HTTP/1とHTTP/2+間のHTTP-TCPマッピングの違い

つまり、HTTP/2+では継続的なポーリングは利点となりますが、HTTP/1では欠点となります。

HTTP/1

HTTP/2+

TCP接続

HTTPリクエストごとに1つ

多重化(多くのリクエストが接続を共有)

継続的なポーリング実行

パフォーマンスが低下(接続プールの枯渇)

最大の効果(結果をすぐに表示)

KibanaがHTTPプロトコルを検出して最適なポーリングを行う方法

HTTP/2は推奨されているプロトコルであり、Kibanaのデフォルトは9.0以降であるため、このパフォーマンス向上を実装しないのはもったいないでしょう。一方、HTTP/1のエクスペリエンスは非常に陳腐化しているため、プロトコルをまだアップグレードしていないオンプレミス導入でリスクを冒すことは許されません。答えは明確です。どのプロトコルが使用されているかを検出し、最適なポーリング戦略を適用する必要があります。

Kibanaサーバーがどのプロトコルを使用しているかを知ることは確かに可能です。しかし、そこには落とし穴があります:制限要因はブラウザの接続プールです。つまり、本当に重要なのはブラウザが何を使用しているかということです。

プロキシの関係で、これらは必ずしも同じではありません。

水平に連なる3つのコンポーネントを示すアーキテクチャ図。左側が Kibana Server、中央がオプションのProxy、右側がKibana Clientです。サーバーからプロキシへのホップは、kibana.yml の server.protocol でラベル付けされ、既知のプロトコルを示しています。プロキシからクライアントへのホップには3つの疑問符が付けられており、その最終ホップのプロトコルが不明であり、異なる可能性があることを示しています。

プロトコルはネットワークホップごとに異なる場合があります

最適化をサーバープロトコルに基づいて行うと、2つの誤りのどちらかが起こり得ます。

  1. 適用すべきでないのに継続的なポーリングを適用し、エクスペリエンスを低下させる。

  2. 継続的ポーリングを適用すべき場合に適用せず、最適化の機会を逃す。

幸いなことに、最新のブラウザは PerformanceObserver を使用することで、完了したリクエストの最後のネットワークホップのプロトコルを検出する方法を提供しています。そこで、最初のクエリ送信のプロトコルを監視し、それに基づいて最適化します。

new PerformanceObserver((list) => {
  const entries = list.getEntries();
  const entry = entries.find(({ name }) => name.includes('/internal/search/'));
  if (entry) {
    this.protocolSupportsMultiplexing = ['h2', 'h3'].includes(entry.nextHopProtocol);
  }
});

ラボでの結果:継続的ポーリングと従来のポーリングとの比較(Kibana)

継続的なポーリングを検証するために、1秒から23秒の範囲でクエリが遅延するダッシュボードを作成し、最適化を有効にした状態と有効にしていない状態での読み込み時間を測定しました。次に、継続的なポーリングが有効なダッシュボードと有効でないダッシュボードを読み込み、その結果を(賞品のかかったレースのように楽しんで)測定しました。

Kibanaの継続的ポーリングに関するラボテスト結果を示す棒グラフ:クエリ実行時間が1秒から23秒までの場合における、従来のポーリングと比較した時間短縮効果。節約時間は、クエリがポーリング間隔の境界に対してどこで完了するかによって、ほぼゼロから4.9秒まで変化し、バックオフスケジュールによって予測された鋸歯状のレイテンシーパターンが確認できます。

クエリの実行時間別ダッシュボードの読み込み時間

このパターンは、元のノコギリ型の図を踏襲しています。クエリの期間によっては、効果が小さい場合もあれば、数秒に及ぶ場合もあります。

まとめ

この最適化により、従来のポーリング方式に内在する遅延を、より効率的な継続的ポーリング方式に置き換えることに成功しました。主な課題は、HTTP/1環境でのパフォーマンス低下を防ぐために、この最適化を条件付きで実装することでした。私たちはこの課題を、ブラウザの PerformanceObserver を使って、最終ネットワークホップで使用されているプロトコルを確実に検出することで解決しました。

ラボでのテストによりこの理論が検証され、継続的なポーリングによって結果が準備でき次第すぐに得られることが示されました。平均して、これはユーザーエクスペリエンスの有意義な改善につながり、データの読み込みを最大25%高速化します。

この取り組みは、ユーザーが洞察を得るまでの時間を短縮するという私たちのコミットメントにおける、最新のステップです。KibanaをElasticsearchデータに対してより透明性の高いプロキシにすることで、私たちの影響が及ぶ範囲内でのパフォーマンスの限界を押し広げます。ぜひ今後の続報をお待ちください。

(2025年、トーマス・ナイリンクはKibanaのダッシュボードのパフォーマンスを向上させる方法と動機について優れた概要を紹介しました。これはその取り組みをアップデートしたものです。

よくあるご質問

継続的なポーリングは、Kibanaのダッシュボードの読み込みをどのように改善するのでしょうか?

ダッシュボードの読み込み速度は、KibanaがElasticsearchからクエリ結果を取得できる速さによって異なります。従来のポーリングでは、完了を定期的に確認するため、結果の取得に遅延が生じる可能性があります。HTTP/2+では、Kibanaは自動的に継続的なポーリングを有効にし、接続を開いたままにすることで遅延を防ぎ、準備ができ次第すぐに結果を配信します。

継続的ポーリングとは何ですか?また、Kibanaのパフォーマンスはどのように向上しますか?

継続的なポーリングは、定期的なチェックの合間にスリープするのではなく、Elasticsearchのクエリ結果を待つ間、HTTP接続を開いたままにしておくことで、従来のパターンを逆転させます。これにより、時間の無駄がなくなり、準備が整い次第結果が表示されるため、ダッシュボードとDiscoverの表示が高速化されます。

HTTP/1接続で連続ポーリングは機能しますか?

いいえ。継続的なポーリングは、多重化が長時間のリクエストによって他のトラフィックがブロックされるのを防ぐHTTP/2+接続でのみ適用されます。Kibanaはブラウザの PerformanceObserver API を使用してプロトコルを自動的に検出し、HTTP/1 で従来のポーリングを適用してパフォーマンスの低下を回避します。

継続的なポーリングを行うKibanaのダッシュボードはどのくらい速くなりますか?

ラボテストによると、クエリの期間によっては、ダッシュボードの読み込み時間が最大25%改善されることが示されています。長いクエリほど絶対的な節約時間が長く、非常に短いクエリではほとんど差がありません。

Kibanaはどのようにして使用すべきポーリングが継続的ポーリングか従来型ポーリングかを検出するのでしょうか?

Kibanaはブラウザの PerformanceObserver API を使用して、最初のクエリリクエストのHTTPプロトコルを検出します。プロトコルが(多重化をサポートする)HTTP/2またはHTTP/3であれば、継続的ポーリングが有効になります。HTTP/1が検出された場合、接続プールの枯渇を防ぐために従来のポーリングが使用されます。

継続的なポーリングはネットワークプロキシやロードバランサーに問題を引き起こすのでしょうか?

継続的ポーリングは、ブラウザ接続プールの枯渇を避けるためにHTTP/2+多重化に依存しています。プロキシがプロキシとブラウザ間の接続をHTTP/1にダウングレードした場合、Kibanaはこれを検出し、代わりに従来のポーリングを使用します。この最適化は、ブラウザが実際に使用するプロトコルに基づいて条件付きで適用されます。

タイムアウトが発生しています。どうすればいいでしょうか?

プロキシがHTTP/2+を使用している一方、タイムアウトを30秒未満に設定している場合、検索のタイムアウトが発生します。この問題を解決するには、プロキシのタイムアウトまでの時間を伸ばすか、kibana.yml で data.search.asyncSearch.pollLength をタイムアウトより小さい値に設定します。

関連記事

AI搭載ダッシュボード:ビジョンからKibanaへ

Jeffrey Rengifo

Kibana を使用して地理空間データを Elasticsearch に取り込み、ES|QL で使用できるようにする

Craig Taverner

変数コントロールによるKibanaダッシュボードのインタラクション性の向上

Teresa Alvarez Soler

描くのではなく、説明する:MCPとES|QLによるAIネイティブのKibanaダッシュボード

Stratoula Kalafateli

Spotify Wrapped パート2: データ分析と視覚化

Philipp Kahr

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう