如何解决 Elasticsearch 查询缓慢的问题以获得更好的用户体验

作者:Philipp Kahr

Elasticsearch Service 用户的重要注意事项:目前,本文中描述的 Kibana 设置更改仅限于 Cloud 控制台,如果没有我们支持团队的手动干预,则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制,以便我们的所有用户都可以启用内部 APM。 本地部署不受此问题的影响。

对于任何使用 Elasticsearch 作为搜索引擎的人来说,识别查询并排除查询故障是一项需要掌握的关键技能。 无论是电子商务、可观察性还是面向工作场所的搜索解决方案,缓慢的 Elasticsearch 都会对用户体验产生负面影响。

要查明慢速 Elasticsearch 查询,你可以使用慢速日志,它捕获在特定阈值运行的查询。 正确设置慢日志阈值本身就是一个挑战。 例如,在满负载下花费 500 毫秒的查询可能是可接受的,但在低负载下相同的查询可能是不可接受的。 慢日志不区分并记录 500 毫秒以上的所有内容。 慢日志很好地完成了它的工作,你可以根据阈值捕获不同级别的粒度。 相反,跟踪可以查看所有查询,确定有多少查询在特定阈值内。

应用程序性能监控 (APM) 不再仅限于你的应用程序。 使用 Elasticsearch 中的检测,我们现在可以将 Elasticsearch 添加为成熟的服务,而不是对应用程序堆栈的依赖。 通过这种方式,我们可以获得比慢速日志更细致的性能视图。

对于以下示例,我们的数据语料库是 OpenWebText,它提供大约 40GB 的纯文本和大约 800 万个单独文档,这些文档在具有 32GB RAM 的 M1 Max Macbook 上本地运行。

让我们开始吧!

在 Elasticsearch 中激活跟踪是通过静态设置(在 elasticsearch.yml 中配置)和动态设置完成的,可以在运行时使用 PUT _cluster/settings 命令进行切换,其中动态设置之一是采样率。 某些设置(例如采样率)可以在运行时切换。 在 elasticsearch.yml 中我们要设置以下内容:

tracing.apm.enabled: true
tracing.apm.agent.server_url: "url of the APM server"

秘密令牌(或 API 密钥)必须位于 Elasticsearch 密钥库中。 使用以下命令 elasticsearch-keystore add Tracing.apm.secret_token 或 Tracing.apm.api_key 应该可以在 <your elasticsearch install directory>/bin/elasticsearch-keystore 中找到密钥库工具。 之后,你需要重新启动 Elasticsearch。 有关跟踪的更多信息可以在我们的跟踪文档中找到。

一旦 APM 处于活动状态,我们就可以查看 Kibana 中的 APM 视图,并看到 Elasticsearch 自动捕获各种 REST API 端点。 在这里,我们主要关注 POST /{index}/_search 调用,看看我们能从中获得什么。

通过直接检查 GET /{index}/_search 框上的简单查询,我们看到以下瀑布细分。 其中包含内部跨度(span),可以更深入地了解 Elasticsearch 在幕后所做的事情。 我们看到这次搜索的总持续时间(86 毫秒)。

查询附带的元数据包括有关 HTTP 标头、用户代理、Elasticsearch 节点位置(云提供商元数据、主机名、容器信息)、一些系统信息和 URL 详细信息的大量信息。 使用一些基本的交易信息,我们可以创建一个透镜图,绘制平均交易持续时间,并允许我们查看是否存在上升或下降趋势。

我们的搜索应用程序

很高兴不再需要使用慢日志! 我可以确定交易持续时间并确定在任何阈值下回答了多少搜索。 然而,有一个挫折 —— Elasticsearch 不会捕获发送的查询(查询的具体内容是什么),因此我们知道查询花费了很长时间,但我们不知道查询是什么。

让我们测试一个示例搜索应用程序。 在本例中,我们将使用一个简单的 Flask 应用程序,其中包含两个路由:search_single 和 search_phrase,它们将表示 Elasticsearch 中的 match 和 match_phrase 查询。 例如,我们可以使用以下查询:

{
  "query": {
    "match": {
      "content": "support"
    }
  }
}

{
  "query": {
    "match_phrase": {
      "content": "support protest"
    }
  }
}

以下 Flask 代码实现了 search_single 路由。 search_phrase 非常相似,只是它使用 match_phrase 而不是 match。

@app.route("/search_single", methods=["GET"])
def search_single():
    query = request.args.get("q", "")
    if not query.strip():
        return jsonify({"error": "No search query provided"}), 400
    try:
        result = es.search(
            index=ES_INDEX, query={"match": {"content": query}}
        )

        hits = result["hits"]["hits"]
        response = []
        for hit in hits:
            response.append(
                {
                    "score": hit["_score"],
                    "content": hit["_source"]["content"],
                }
            )
        
        return jsonify(response)

准备就绪后,我现在可以调用 curl -XGET “http://localhost:5000/search_single?q='microphone'” 来搜索术语 “microphone”。

我们主要将 APM 添加到我们的搜索应用程序中进行观察,但我们的 APM 代理捕获传出请求并使用元数据信息丰富它们。 在我们的例子中,span.db.statement 包含 Elasticsearch 查询。 在下面这个例子中,有人搜索了 window.

将它们拼凑在一起

在我的 Flask 服务中,我将查询大小设置为 5,000,这意味着 Elasticsearch 应在单个 JSON 响应中为我提供最多 5,000 个匹配文档。 这是一个很大的数字,并且大部分时间都花在从磁盘检索这么多文档上。 将其更改为前 100 个文档后,我可以通过比较快速识别仪表板中发生的情况。

在 APM 视图中查看 transaction 并激活关键路径的实验室功能会创建一个覆盖层,向我们显示应用程序将时间花在哪里。

之后,我使用字段 transaction.duration.us、es_query_took、transaction.name 创建了一个仪表板。 一般 KQL 过滤器包含 service.name、processor.event: transaction、transaction.name: POST /{index}/_search。

附加提示:转到数据视图管理 > 选择包含 APM 数据流的数据视图 > 选择 transaction.duration.us 字段 > 并将格式更改为 duration。 现在它会自动以人类可读的输出而不是 microseconds 的形式呈现它。

利用 Lens 注释(annotation)功能,我们可以在中间 Lens 中看到,更改为 100 个文档使平均搜索 transaction 量下降了很多。 不仅如此,查看右上角的记录总数。 由于我们可以更快地搜索,因此我们有更高的吞吐量! 我真的很喜欢直方图,因此我在顶行的中间创建了一个直方图,其中 X 轴为交易持续时间,Y 轴为记录数。 此外,APM 还提供指标,因此我们可以随时确定发生了多少 CPU% 使用情况以及 JVM 堆、非堆使用情况、线程计数和更多有用信息。

 

结论

这篇博文向您展示了将 Elasticsearch 作为仪表化应用程序并更轻松地识别瓶颈是多么重要。 此外,你还可以使用事务持续时间作为异常检测的指标,为你的应用程序进行 A/B 测试,并且再也不用怀疑 Elasticsearch 是否感觉更快,因为你现在有数据可以回答这个问题。 此外,从用户代理收集到查询的所有元数据都可以帮助你排除故障。

可以从此处导入仪表板和数据视图。

警告
Elasticsearch 内部的 transaction duration 存在问题。 此问题已在即将发布的 8.9.1 版本中修复。 在此之前,transaction 使用错误的时钟,这会扰乱整体持续时间。

本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。 当前不可用的任何特性或功能可能无法按时交付或根本无法交付。

原文:How to troubleshoot slow Elasticsearch queries for better user experience | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/64373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle-expdp报错ORA-39077、06502(Bug-16928674)

问题: 用户在使用expdp进程导出时&#xff0c;出现队列报错ORA-39077、ORA-06502 ORA-31626: job does not exist ORA-31638: cannot attach to job SYS_EXPORT_SCHEMA_01 for user SYS ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$…

Windows下安装 Redis

目录 1.下载 1.1.Redis官网 1.2.github下载地址 2.安装步骤 2.1.解压Redis压缩包 2.2.创建临时服务 2.3.启动客户端 2.4.注册Redis服务 3.总结 4.致谢 1.下载 1.1.Redis官网 Download | Redis Redis 官方网站没有提供 Windows 版的安装包&#xff0c;但可以通过…

标准化归一化 batch norm, layer norm, group norm, instance norm

Layer Normalization - EXPLAINED (in Transformer Neural Networks) Layer Normalization - EXPLAINED (in Transformer Neural Networks) 0~4min:什么是multi-head attention 5~7min:layer norm图示 7~9min:公式举例layer norm 9:54-end:layer norm的代码示例 group n…

什么?200?跨域?

情景复现 今天我遇到了一件很奇怪的事情就是&#xff0c;当我请求后端网关&#xff0c;然后通过网关去请求相应的服务&#xff0c;都进行了跨域处理 但是&#xff0c;奇怪的是我在请求的时候&#xff0c;回来的响应码是200&#xff0c;但是报错了&#xff0c;报的还是200的同…

对等离子体的认识

认识等离子体等离子体的产生等离子体的定义等离子体并不远 认识等离子体 等离子体的产生 物质由一百多种元素组成&#xff0c;不同元素结合成各种分子。大量的分子又依靠某种作用力结合或凝聚在一起&#xff0c;由于作用力的强弱不等而表现为各种不同的存在状态。 物质的存在状…

Centos7克隆快速复制多台虚拟机|互通互联

背景&#xff1a;有时候&#xff0c;我们在用虚拟机的时候会用到多个进行使用。重新安装会花费大量的时间&#xff0c;此时&#xff0c;我们可以通过vmware虚拟机自带的功能快速克隆出完全相同的系统。 前提&#xff1a;被克隆的虚拟机系统要处于关闭状态 步骤&#xff1a;…

【图论】单源最短路

算法提高课笔记。&#xff08;本篇还未更新完… 目录 单源最短路的建图方式例题热浪题意思路代码 信使题意思路代码 香甜的黄油题意思路代码 最小花费题意思路代码 最优乘车题意思路代码 昂贵的聘礼题意思路代码 单源最短路的建图方式 最短路问题可以分为以下两类&#xff1a…

了解文档管理软件在团队协作中的作用

在团队协作中&#xff0c;文档管理软件发挥着重要的作用。文档管理软件是一种使团队成员可以共享、编辑、审查和保存各种文档的工具。它以一种结构化的方式存储和组织文档&#xff0c;提供了团队成员之间的协同工作和知识共享的平台。 文档管理软件提供了一个集中的库&#xf…

哪种模式ip更适合你的爬虫项目?

作为一名爬虫程序员&#xff0c;对于数据的采集和抓取有着浓厚的兴趣。当谈到爬虫ip时&#xff0c;你可能会听说过两种常见的爬虫ip类型&#xff1a;Socks5爬虫ip和HTTP爬虫ip。但到底哪一种在你的爬虫项目中更适合呢&#xff1f;本文将帮助你进行比较和选择。 首先&#xff0c…

系统架构设计师-软件架构设计(7)

目录 大型网站系统架构演化 一、第一阶段&#xff1a;单体架构 到 第二阶段&#xff1a;垂直架构 二、第三阶段&#xff1a;使用缓存改善网站性能 1、缓存与数据库的数据一致性问题 2、缓存技术对比【MemCache与Redis】 3、Redis分布式存储方案 4、Redis集群切片的常见方式 …

kubeadml 安装 k8s

目录 一&#xff1a;kubeadml 安装 k8s 1、网络环境 2、 环境准备 3、 所有节点安装docker 4、所有节点安装kubeadm&#xff0c;kubelet和kubectl ​5、部署K8S集群 6、测试 二&#xff1a; 部署 Dashboard 一&#xff1a;kubeadml 安装 k8s 1、网络环境 master&am…

UNITY3D 虚拟数字人方向,动捕设备测评 VDSuit-Full

我们成功的用它做了线下演出活动。 开发测试视频 VDSuit-Full动捕开发 分别说优点和不足 优点&#xff1a; 人工技术答疑及时 有厂家解答各种疑难杂症&#xff08;工作日一般1小时就得到回复&#xff09; 比如穿戴&#xff0c;使用方法&#xff0c;限制等。 动作整体捕捉效果较…

vue- 创建wms-web项目

vue 发展历程 安装vite 第一步 创建wms-web项目 第二步 打开文件夹并安装所有开发环境的依赖 都可以放静态资源 public>vite.svg 不会重新编译成其他名字 assets>vue.svg 会重新编译成一个随机的名称 重新编译 启动 第三步 spa 单页渲染 第四步 安装路由 第五步 …

uniapp实现支付宝菜单展开与收起

需求实现支付宝类似的效果&#xff1a; 思路&#xff1a; 1.首先建立展开收起按钮&#xff0c;这里使用的是uview里面的icon图标。 2.其次建立展开菜单内容&#xff0c;这里只演示了文本信息&#xff0c;后期引入首页应用。 3.最后写js逻辑&#xff0c;展开收起时改变盒子高度和…

整理mongodb文档:删

个人博客 整理mongodb文档:删 求关注&#xff0c;哪儿不足&#xff0c;求大佬们指出&#xff0c;哪儿写的不够通俗易懂跟清晰&#xff0c;也求指出 文章概叙 本文主要是介绍了删除数据的几个方法&#xff0c;主要还是在介绍deleteMany、deleteOne以及remove&#xff0c;对于…

OpenCv.js(图像处理)学习历程

opencv.js官网 4.5.0文档 以下内容整理于opencv.js官网。 简介 OpenCV由Gary Bradski于1999年在英特尔创建。第一次发行是在2000年。OpenCV支持c、Python、Java等多种编程语言&#xff0c;支持Windows、Linux、Os X、Android、iOS等平台。基于CUDA和OpenCL的高速GPU操作接口也…

深度学习和OpenCV的对象检测(MobileNet SSD图像识别)

基于深度学习的对象检测时,我们主要分享以下三种主要的对象检测方法: Faster R-CNN(后期会来学习分享)你只看一次(YOLO,最新版本YOLO3,后期我们会分享)单发探测器(SSD,本节介绍,若你的电脑配置比较低,此方法比较适合R-CNN是使用深度学习进行物体检测的训练模型; 然而,…

【linux】安装pytorch3d

写在开头 不要看网上的博客安装&#xff0c;直接参考官方安装文档去安装。 坑 坑1&#xff1a;安装pytorch3d后torch.cuda用不了 使用下面的命令安装后 conda install pytorch3d会提示安装下面的包&#xff0c;注意pytorch和torchvision都是cpu版本的&#xff0c;这样就会…

参考RabbitMQ实现一个消息队列

文章目录 前言小小消息管家1.项目介绍2. 需求分析2.1 API2.2 消息应答2.3 网络通信协议设计 3. 开发环境4. 项目结构介绍4.1 配置信息 5. 项目演示 前言 消息队列的本质就是阻塞队列&#xff0c;它的最大用途就是用来实现生产者消费者模型&#xff0c;从而实现解耦合以及削峰填…

docker安装neo4j

参考文章&#xff1a; 1、Mac 本地以 docker 方式配置 neo4j_neo4j mac docker_Abandon_first的博客-CSDN博客 2、https://www.cnblogs.com/caoyusang/p/13610408.html 安装的时候&#xff0c;参考了以上文章。遇到了一些问题&#xff0c;记录下自己的安装过程&#xff1a; …