如何解决 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"}), 400try: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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis宗地或者地块四至权利人信息提取教程

ARCGIS怎样将图斑四邻的名称及方位加入其属性表 以前曾发表过一篇《 如何把相邻图斑的属性添加在某个字段中》的个人心得,有些会员提出了进一步的要求,不但要相邻图斑的名称,还要求有方位,下面讲一下自己的做法。 基本思路是:连接相邻图斑质心,根据连线的角度确定相邻图斑…

c++游戏制作指南(三):c++剧情类文字游戏的制作

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

21、p6spy输出执行SQL日志

文章目录 1、背景2、简介3、接入3.1、 引入依赖3.2、修改database参数&#xff1a;3.3、 创建P6SpyLogger类&#xff0c;自定义日志格式3.4、添加spy.properties3.5、 输出样例 4、补充4.1、参数说明 1、背景 在开发的过程中&#xff0c;总希望方法执行完了可以看到完整是sql语…

供水管网漏损监测,24小时保障城市供水安全

供水管网作为城市生命线重要组成部分&#xff0c;其安全运行是城市建设和人民生活的基本保障。随着我国社会经济的快速发展和城市化进程的加快&#xff0c;城市供水管网的建设规模日益增长。然而&#xff0c;由于管网老化、外力破坏和不当维护等因素导致的供水管网漏损&#xf…

js修改img的src属性显示变换图片到前端页面,img的src属性显示java后台读取返回的本地图片

文章目录 前言一、HTML 图像- 图像标签&#xff08; <img>&#xff09;1.1图像标签的源属性&#xff08;Src&#xff09;1.2图像标签源属性&#xff08;Src&#xff09;显示项目中图片1.3图像标签源属性&#xff08;Src&#xff09;显示网络图片 二、图像标签&#xff08…

Docker实战-关于Docker镜像的相关操作(二)

导语   之前的分享中&#xff0c;我们介绍了关于Docker镜像的查询操作相关的内容&#xff0c;下面我们继续来介绍删除清理、导入导出、创建镜像等操作。 如何删除和清理镜像&#xff1f; 使用标签删除镜像 可以使用docker rmi 或者是 docker image rm 命令来删除镜像&#x…

segment-anything使用说明

文章目录 一. segment-anything介绍二. 官网Demo使用说明三. 安装教程四. python调用生成掩码教程五. python调用SAM分割后转labelme数据集 一. segment-anything介绍 Segment Anything Model&#xff08;SAM&#xff09;根据点或框等输入提示生成高质量的对象遮罩&#xff0c…

spring eurake中使用IP注册

在开发spring cloud的时候遇到一个很奇葩的问题&#xff0c;就是服务向spring eureka中注册实例的时候使用的是机器名&#xff0c;然后出现localhost、xxx.xx等这样的内容&#xff0c;如下图&#xff1a; eureka.instance.perferIpAddresstrue 我不知道这朋友用的什么spring c…

爬虫009_字符串高级_替换_去空格_分割_取长度_统计字符_间隔插入---python工作笔记028

然后再来看字符串的高级操作 取长度 查找字符串下标位置 判断是否以某个字符,开头结尾 计算字符出现次数 替换

sigmoid ReLU 等激活函数总结

sigmoid ReLU sigoid和ReLU对比 1.sigmoid有梯度消失问题&#xff1a;当sigmoid的输出非常接近0或者1时&#xff0c;区域的梯度几乎为0&#xff0c;而ReLU在正区间的梯度总为1。如果Sigmoid没有正确初始化&#xff0c;它可能在正区间得到几乎为0的梯度。使模型无法有效训练。 …

什么是OCR?OCR技术详解

光学字符识别(Optical Character Recognition)简称为“OCR”。ORC是指对包含文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的技术。 一般包括以下几个过程&#xff1a; 1.图像输入 针对不同格式的图像&#xff0c;有着不同的存储格式和压缩方式。目前&…

TypeScript学习笔记

1.ts和js的区别 2. ts的优势 3. ts下载后报错解决方法 报错: PS C:\Users\\Desktop> tsc -v tsc : 无法加载文件 C:\Users\32173\AppData\Roaming\npm\tsc.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/ go.microsoft.com/fwlink/?…

接口测试——电商网站接口测试实战(四)

1. 接口测试需求分析 常见接口文档提供的两种方式 ①word文档 ②在线文档 电商网站网址模拟练习&#xff1a;Swagger UI 2. 登陆的分析 慕慕生鲜网址&#xff1a;慕慕生鲜账号密码点击execute后 输入账号密码后点击开发者工具&#xff0c;再登录&#xff0c;点击网络&…

Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比

1、gdb和pdb分别是什么&#xff1f; 1.1、gdb GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的命令行调试工具&#xff0c;由GNU项目开发&#xff0c;用于调试C、C等编程语言的程序。它在多个操作系统中都可以使用&#xff0c;包括Linux、MacOS和Windows&#xff0…

oracle的管道函数

Oracle管道函数(Pipelined Table Function)oracle管道函数 1、管道函数即是可以返回行集合&#xff08;可以使嵌套表nested table 或数组 varray&#xff09;的函数&#xff0c;我们可以像查询物理表一样查询它或者将其赋值给集合变量。 2、管道函数为并行执行&#xff0c;在…

如何实现基于场景的接口自动化测试用例?

自动化本身是为了提高工作效率&#xff0c;不论选择何种框架&#xff0c;何种开发语言&#xff0c;我们最终想实现的效果&#xff0c;就是让大家用最少的代码&#xff0c;最小的投入&#xff0c;完成自动化测试的工作。 基于这个想法&#xff0c;我们的接口自动化测试思路如下…

软件设计师(七)面向对象技术

面向对象&#xff1a; Object-Oriented&#xff0c; 是一种以客观世界中的对象为中心的开发方法。 面向对象方法有Booch方法、Coad方法和OMT方法等。推出了同一建模语言UML。 面向对象方法包括面向对象分析、面向对象设计和面向对象实现。 一、面向对象基础 1、面向对象的基本…

【数据结构与算法】二叉排序树(BST)

二叉排序树&#xff08;BST&#xff09; 需求&#xff1a; 给你一个数列{7,3,10,12,5,1,9}&#xff0c;要求能够高效的完成对数据的查询和添加。 解决方案分析 使用数组 数组未排序&#xff0c;优点&#xff1a;直接在数组尾添加&#xff0c;速度快。缺点&#xff1a;查找速…

[C++项目] Boost文档 站内搜索引擎(3): 建立文档及其关键字的正排 倒排索引、jieba库的安装与使用...

之前的两篇文章: 第一篇文章介绍了本项目的背景, 获取了Boost库文档 &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…第二篇文章 分析实现了parser模块. 此模块的作用是 对所有文档html文件, 进行清理并汇总 &#x1fae6;[C项目] …

Spring Boot整合ES的两种方式

使用Spring Data Elasticsearch Starter 在Spring Boot中整合Elasticsearch的方式之一是使用Elasticsearch的官方Spring Data Elasticsearch Starter。该Starter提供了对Elasticsearch的高级集成&#xff0c;简化了配置和管理Elasticsearch客户端。 下面是使用Spring Data E…