私は、SQLクエリを避けるために、検索だけでなく製品データ(/ index/type/{id})を取得するために、かなりの時間eCommerceサイトにelasticsearchを使用しています。遅いelasticsearch応答の原因を見つける
通常、これは本当にうまく動作し、ほとんどのリクエストは1ms〜3msの間に応答されます。しかし、/ index/type/{id}のようなGETリクエストの場合、実際の検索は行われず、通常は1-2msかかるので、100ms〜250msかかる要求もあります。サーバーがRAMの多くを持っているので、何かが間違っていなければならないと思われます。&速い6コアCPU、データは非常に高速なSSDに保存され、150,000エントリー(Elasticsearchでは約300MB)、負荷はほとんどありません。 Elasticsearchには5GBのRAMがあり、Luceneがすべてのエントリを常にキャッシュするのに十分なスペアRAMがあります。要求は、専用のスイッチを使用してローカルネットワークを介して行われます。インデックスには1つの断片しかなく、私はElasticsearch 2.3を実行しています。
私はPHPでリクエストしています。私はすでにElginsearchのリバースプロキシとしてNginxを使ってみましたが、これは何も解決しませんでした。
:遅い要求は、(要求の総数に対して)約1%の時間で発生します。私はまた、Elasticsearchの/ index/type/{id}にPHPで1000件のリクエストを行うだけで再現できます。/ index/type/55のような同じIDを使用していても常に1%は本当に遅くなりますIDが存在する)。これは、「キャッシュエフェクト」がないことを意味します。最初のリクエストElasticsearchの後に、データが「準備完了」である必要がありますが、同じIDを何度も要求しても、遅いリクエストの数は同じです。
EDIT2:私はマーベル& Kibanaと私のノードの統計を見ていない、と何もスローダウンを示していない:JVMのヒープメモリの20から40パーセントの間で使用され、0.1msと0.5の間にほとんどのレイテンシ(ミズ)。十分なリソースがあることを確認して、遅いリクエストの原因に対する相関やヒントがないことを確認します。多くのテストの後
:これらは今、私の明確なテスト結果です
:
- 大きなElasticsearchからの応答を、より多くの可能性が遅いリクエストが起きようとしています。小さなレスポンスの多くは、1つの大きなレスポンスに比べて例外的に遅くならない可能性が非常に高くなります。
- 簡単なGETリクエストでBombarding Elasticsearchを使用すると、より多くのリクエストを並行して実行すると応答が遅くなる可能性が低くなります。
- Elasticsearchは、1つのキーワードに対して簡単な検索を繰り返して使用すると、アプリケーションが受信するまでに応答が200msかかる場合でも、応答に「2-3ms」かかることがわかります。しかし、ここでも:応答が大きければ、応答が遅い可能性が高くなります。要求のループを実行すると1KBの応答が遅くなることはありません。2.5KBはごくわずかな遅さ(30ms)ですが、10KBの応答は常に200msまでの遅い要求の1%まであります。
私は、特にElasticsearchが遅いと思っている場合には、ネットワークの「問題」があると考えました。しかし、私の設定はとても標準的なので(Debian Jessie)、それは奇妙な根本原因になるでしょう。また、キープアライブ接続とTCP_NODELAYは、この問題を改善するために何もしません。
根本的な原因を見つける方法を知っていて、何が起こっている可能性がありますか?
AWS CloudSearch、RDS、EC2/BeanStalk、ElastiCacheを使用しています。最近、さまざまなDNSルックアップで200msの遅延が見られました。 – Scuzzy
100〜200msの遅延はどこから見られますか?アプリケーションを経由したフルブラウザのラウンドトリップ、またはエンドポイントからAWS検索サービスへの直接アクセスは可能ですか? – Scuzzy
私は独自のサーバーを使用しています(コロケーション) - PHPで測定したものです。測定にはElasticsearchへのリクエストがどれくらいかかるかを測定します。 DNSルックアップがなく、私はサーバーのIPに直接アクセスします。 – iquito