<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Drew Tate - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Drew Tate - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/jp/search-labs/author/drew-tate</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/author/drew-tate</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/author/drew-tate.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Fri, 18 Sep 2026 21:23:05 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Kibanaはダッシュボードの読み込み時間を最大25％短縮 - その背後にあるポーリング戦略を紹介]]></title>
    <description><![CDATA[Kibanaが継続的なポーリングとブラウザ側のHTTP/2検出を使用して、ダッシュボードの読み込み時間を最大25％削減し、HTTP/1に自動的にフォールバックする仕組みをご覧ください。]]></description>
    <content:encoded><![CDATA[<p>継続的なポーリングにより、KibanaのダッシュボードとDiscoverの読み込みが最大25％速くなりました。Kibanaは、定期的なチェックの合間にスリープする代わりに、HTTP接続を開いたままに維持し、準備ができたらすぐにElasticsearchのクエリ結果を配信するようになりました。HTTP/2+（9.0以降のKibanaのデフォルト）では、自動的に有効になるため、設定は不要です。HTTP/1では、Kibanaは接続プールの枯渇を防ぐために従来のポーリングに戻ります。</p><h2>Kibanaがダッシュボードを読み込む際にデータを取得する方法</h2><p>ダッシュボードを開くと、ほとんどのパネル（内部的には、これらを<em>埋込</em>と呼びます）が1つ以上のElasticsearchクエリを開始します。しかし、同期検索の単純な呼び出しと応答の代わりに、非同期検索のパワーを使います（<a href="https://www.elastic.co/docs/solutions/search/async-search-api">ドキュメント</a>）。</p><p>非同期検索では、クエリ結果が特定のHTTPリクエスト外でもElasticsearch内で利用可能な状態に保たれます。これが重要な理由を以下に挙げます。</p><ul><li><p>ネットワークの不安定性に耐性が高く、データの読み込みを安定させます</p></li><li><p><a href="https://www.elastic.co/docs/explore-analyze/discover/background-search">バックグラウンド検索機能</a>により、ユーザーは長時間実行されるダッシュボードやDiscoverセッションを待つ間も、Kibanaで他の作業を行うことができます</p></li></ul><p>最初のクエリが送信された後、Kibanaは検索を監視して完了を検出し、結果のセットを取得します。</p><h3>従来のポーリングがKibanaのダッシュボードのロード時間に与える影響</h3><p>従来のポーリングでは、Kibanaはクエリを送信し、最初の接続を閉じてから、Elasticsearchの完了を定期的にチェックします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt093ed1a718d2f2ed/6a1710c28b73cb568118a109/2f44064a2e627866e129eb626f68ddd62230a4e2-1999x719.png" alt="Kibanaでの従来のポーリングを示す図。Kibanaのタイムラインには、クエリ送信後の短い接続オープン期間、それに続く長いスリープ期間、ステータスの簡単なポーリング、そして結果が表示されます。Elasticsearchのタイムラインは、Kibanaのスリープ期間の途中で完了するクエリを実行します。これは、時間のロスの原因となっている調整ギャップを示しています。" /><p>Elasticsearchは、クエリ送信後に検索を完了して結果を返すまでの短い時間を設けています。もし検索がこれほど速く完了する場合、それは単純な呼び出しと応答のやり取りに相当します。しかし、長時間の検索の場合、最初の接続は切断され、Kibanaは検索の完了を定期的に確認し始めます。これは<em>ポーリング</em>と呼ばれます。</p><h4>従来のポーリングのパフォーマンス上の課題</h4><p>上の図をご覧いただくと、このアプローチのパフォーマンス上の欠点がお分かりいただけるかもしれません。検索はKibanaのスリープインターバルのいずれかで終了する可能性が最も高く、そのため時間の無駄につながります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3685326f1aa90a1b/6a1710c30c4857892b01ab7a/ad8b80d9e8d6d774065d62e352aad47c3ddb4686-1999x719.png" alt="従来のポーリングのパフォーマンスコストを示すタイムライン図。Kibanaのタイムラインには、接続オープン期間、長いスリープ期間、ステータスのポーリング、そして結果の配信が表示されます。Elasticsearchのタイムラインには、Kibanaのスリープ中にクエリが完了し、その後に赤いロストタイムセグメント（Kibanaがスリープから復帰して結果を取得するまでの無駄な期間）が表示されます。" /><p>最悪のシナリオ（検索がスリープ期間の始めに完了する場合）では、ポーリングインターバルの全期間が無駄になります。</p><h4>バックオフ戦略の影響</h4><p>ポーリング時にはバックオフ戦略を適用するのが標準的な方法です。これは、検索の期間が長くなるほど、ポーリングの頻度が低くなることを意味します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37fb76cf22647ee5/6a1710c5a929cf6fcaae0abd/77665de4a0fd166b533a2c2c55f6f28e38cf37ce-1200x338.png" alt="クエリ期間別にKibanaのポーリング間隔のバックオフスケジュールを示す横棒グラフ。1.5秒未満のクエリは約0.5秒間隔、1.5～5秒のクエリは1秒、5～20秒のクエリは約2.5秒、20秒を超えるクエリは5秒のポーリング間隔を使用します。" /><p>しかし、これはまた、検索の期間に応じて潜在的な時間損失が比例して増加することを意味します。</p><h4>ポーリング間隔がノコギリ状のレイテンシパターンを作り出す仕組み</h4><p>これらの要素を合わせると、失われた時間は段階的なノコギリ状の関数となります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" alt="秒単位のクエリ完了時間に対する秒単位のロスタイムを示す折れ線グラフで、ロスタイムが上昇してから繰り返しゼロに落ちる鋸歯状のパターンを形成し、クエリの持続時間が0秒から30秒に増加するにつれて、ピークが1秒未満から5秒まで大きくなります。" /><p>ここで、ピークは最悪のシナリオ、谷は最良のシナリオを表しています。これは、従来のポーリングコストが、検索期間（およびネットワーク条件）に応じて、ゼロからポーリング間隔の全期間まで変化することを示しています。</p><h2>継続的なポーリング：Kibanaが待ち時間を排除する仕組み</h2><p>従来のポーリングの問題は、KibanaとElasticsearchの間にある根本的な連携不足です。理想は、Kibanaが結果が利用可能になったことを即座に認識することです。では、ほぼすべての時間をElasticsearchのチェックに費やし、待機時間をまったく設けないポーリングパターンに逆転させたらどうなるでしょうか？</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4566eaaec79150c7/6a1710c78b73cb1df318a10d/7edc138528dfe1310df42f393ee7279fe3c4703b-1999x713.png" alt="Kibanaでの継続的なポーリングを示すタイムライン図。Kibanaのタイムラインは全体が青色で表示されています。クエリの送信から2回の接続更新まで、結果が表示されるまで、接続は開いたままです。スリープ期間はありません。Elasticsearchのタイムラインには、クエリが完了し、結果がすぐに配信されたことが表示されています。凡例にはロスタイムが取り消し線で示され、排除されたことを表しています。" /><p>長時間のポーリングとスリープ期間の廃止を組み合わせることで、結果は準備ができ次第すぐに提供されます。</p><h3>HTTP/1の陳腐化</h3><p>その理論は堅実なものです。では、継続的なポーリングをオンにすると、なぜこのKibana導入はそれほど陳腐化して見えるのでしょうか？</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltede864738a88e1cb/6a1710c947d49c178d2d8af2/517378a73d36bd95927b81b1f912ce465b7adf4c-800x412.gif" alt="Sample Logs Dataデータセットを読み込むKibanaのダッシュボードの動作画面録画で、複数のパネルが順番に表示されます。これには、レスポンスコードの時系列、米国の総リクエスト数を示す地図、ユニークビジター数、HTTPエラー率の指標、そしてマシンのOSと宛先データのサンキーダイアグラムが含まれます。" /><p>重要なのは、この導入がHTTP/1上で実行されていることです。HTTP/1では、HTTPリクエストはTCP接続に1:1でマップされます。そのため、複数の長時間にわたるポーリングリクエストがブラウザの限られた接続プールを占有し、他のリクエストがキューに溜まってしまいます。</p><p>一方、HTTP/2+では、ネットワークリクエストは多重化によってTCP接続を共有できるため、この問題は発生しません。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cddb4d6767a1ccf/6a1710cb839dfa5056dcffcd/f60f3a37baf5ec16c9f1773f08855e7f9e3a7491-1536x1024.png" alt="Kibanaの継続的ポーリングにおけるHTTP/1とHTTP/2を比較した図。HTTP/1では、リクエストごとに1つのTCP接続が必要で、6つの接続でブラウザの接続プールを使い果たします。HTTP/2は、1つのTCP接続で複数のポーリングリクエストを多重化し、プールの枯渇を防ぎ、パフォーマンスを維持します。" /><p>つまり、HTTP/2+では継続的なポーリングは利点となりますが、HTTP/1では欠点となります。</p><p></p><p>HTTP/1</p><p>HTTP/2+</p><p>TCP接続</p><p>HTTPリクエストごとに1つ</p><p>多重化（多くのリクエストが接続を共有）</p><p>継続的なポーリング実行</p><p>パフォーマンスが低下（接続プールの枯渇）</p><p>最大の効果（結果をすぐに表示）</p><h4>KibanaがHTTPプロトコルを検出して最適なポーリングを行う方法</h4><p>HTTP/2は推奨されているプロトコルであり、Kibanaのデフォルトは9.0以降であるため、このパフォーマンス向上を実装しないのはもったいないでしょう。一方、HTTP/1のエクスペリエンスは非常に陳腐化しているため、プロトコルをまだアップグレードしていないオンプレミス導入でリスクを冒すことは許されません。答えは明確です。どのプロトコルが使用されているかを検出し、最適なポーリング戦略を適用する必要があります。</p><p>Kibanaサーバーがどのプロトコルを使用しているかを知ることは確かに可能です。しかし、そこには落とし穴があります：制限要因はブラウザの接続プールです。つまり、本当に重要なのは<em>ブラウザ</em>が何を使用しているかということです。</p><p>プロキシの関係で、これらは必ずしも同じではありません。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc61ff0abfe101eec/6a1710cd2867144b8893e412/13e38001fc4bd3fc60cfc69114fb9098fd745906-1970x786.png" alt="水平に連なる3つのコンポーネントを示すアーキテクチャ図。左側が Kibana Server、中央がオプションのProxy、右側がKibana Clientです。サーバーからプロキシへのホップは、kibana.yml の server.protocol でラベル付けされ、既知のプロトコルを示しています。プロキシからクライアントへのホップには3つの疑問符が付けられており、その最終ホップのプロトコルが不明であり、異なる可能性があることを示しています。" /><p>最適化をサーバープロトコルに基づいて行うと、2つの誤りのどちらかが起こり得ます。</p><ol><li><p>適用すべきでないのに継続的なポーリングを適用し、エクスペリエンスを低下させる。</p></li><li><p>継続的ポーリングを適用すべき場合に適用せず、最適化の機会を逃す。</p></li></ol><p>幸いなことに、最新のブラウザは <code>PerformanceObserver</code> を使用することで、完了したリクエストの最後のネットワークホップのプロトコルを検出する方法を提供しています。そこで、最初のクエリ送信のプロトコルを監視し、それに基づいて最適化します。</p>new PerformanceObserver((list) =&gt; {
  const entries = list.getEntries();
  const entry = entries.find(({ name }) =&gt; name.includes('/internal/search/'));
  if (entry) {
    this.protocolSupportsMultiplexing = ['h2', 'h3'].includes(entry.nextHopProtocol);
  }
});<h2>ラボでの結果：継続的ポーリングと従来のポーリングとの比較（Kibana）</h2><p>継続的なポーリングを検証するために、1秒から23秒の範囲でクエリが遅延するダッシュボードを作成し、最適化を有効にした状態と有効にしていない状態での読み込み時間を測定しました。次に、継続的なポーリングが有効なダッシュボードと有効でないダッシュボードを読み込み、その結果を（<a href="https://github.com/kertal/race-for-the-prize">賞品のかかったレース</a>のように楽しんで）測定しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba4af840d8324923/6a1710ceb339d52fe076a0b6/5f19fb45c5307a7491037fe1ad1a302728793203-1200x742.png" alt="Kibanaの継続的ポーリングに関するラボテスト結果を示す棒グラフ：クエリ実行時間が1秒から23秒までの場合における、従来のポーリングと比較した時間短縮効果。節約時間は、クエリがポーリング間隔の境界に対してどこで完了するかによって、ほぼゼロから4.9秒まで変化し、バックオフスケジュールによって予測された鋸歯状のレイテンシーパターンが確認できます。" /><p>このパターンは、元のノコギリ型の図を踏襲しています。クエリの期間によっては、効果が小さい場合もあれば、数秒に及ぶ場合もあります。</p><h2>まとめ</h2><p>この最適化により、従来のポーリング方式に内在する遅延を、より効率的な継続的ポーリング方式に置き換えることに成功しました。主な課題は、HTTP/1環境でのパフォーマンス低下を防ぐために、この最適化を条件付きで実装することでした。私たちはこの課題を、ブラウザの <code>PerformanceObserver</code> を使って、最終ネットワークホップで使用されているプロトコルを確実に検出することで解決しました。</p><p>ラボでのテストによりこの理論が検証され、継続的なポーリングによって結果が準備でき次第すぐに得られることが示されました。平均して、これはユーザーエクスペリエンスの有意義な改善につながり、データの読み込みを最大25％高速化します。</p><p>この取り組みは、ユーザーが洞察を得るまでの時間を短縮するという私たちのコミットメントにおける、最新のステップです。KibanaをElasticsearchデータに対してより透明性の高いプロキシにすることで、私たちの影響が及ぶ範囲内でのパフォーマンスの限界を押し広げます。ぜひ今後の続報をお待ちください。</p><p>（2025年、トーマス・ナイリンクはKibanaのダッシュボードのパフォーマンスを向上させる方法と動機について<a href="https://www.elastic.co/search-labs/blog/kibana-dashboard-rendering-time">優れた概要</a>を紹介しました。これはその取り組みをアップデートしたものです。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Drew Tate,Matthias Wilhelm]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" length="0" type="image/png"/>
    <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>