改进 Elastic Agent 和 Beats 中的事件队列

作者:Fae Charlton, Alexandros Sapranidis

内部改进如何降低 Elastic 8.13 中的内存使用。

在 8.12 版本中,我们引入了性能预设 —— 一种更简单的方法,用于调整 Elastic Agent 和 Beats 以适应各种场景。这提高了常见环境的性能,而过去通常需要进行详细调整。

从 8.13 版本开始,我们专注于改进我们的内部库,以更好地支持这些预设。其结果是我们的内部事件队列进行了重写,为所有 Beats 带来了降低的内存使用。

在我们的内部基准测试套件中,Filebeat 8.13 在所有预设上显示出大约 20% 的内存减少。在这篇文章中,我们将探讨如何实现这一点。

Beats 事件队列

由 Elastic Agent 和 Beats 接收的事件在发送到输出端时会存储在一个队列中。队列的配置对于需要多少内存来存储这些事件有很大影响。在 8.13 版本之前,这种配置涉及一些容易被误解的参数,这些参数常常是配置错误的常见来源。

我们来回顾一下这些调优参数及其作用。

bulk_max_size 和 flush.min_events

当输出 worker 准备好发送数据时,它会从内部队列请求一批事件。这个请求的大小由 bulk_max_size 控制,这是一个重要的输出调优参数。如果 bulk_max_size 是 100,那么队列将尝试提供 100 个事件给输出 worker 发送。

队列还有一个 flush.timeout 参数。当这个参数为零时,队列会立即返回事件,即使它没有足够的事件。在我们的示例中,如果请求了 100 个事件但队列中只有 50 个,那么输出 worker 将获得 50 个事件。但是当 flush timeout 为正值时,队列会等待达到指定的超时时间以收集更多事件。

但是,请注意:假设我们设置了一个 5 秒的 flush timeout 并请求 100 个事件。你可能会期望,如果队列有 100 个事件,它将立即返回这 100 个事件,否则它将延迟多达 5 秒以达到 100 个事件。从 8.13 版本开始,你会是正确的。但是旧的队列并不是这样的!队列不是等待填充一个输出请求 —— 它等待填充一个内部队列缓冲区,这个缓冲区的大小可能完全不同。

内部队列缓冲区的大小由 flush.min_events 控制,这是一个看起来非常类似于 bulk_max_size 的参数,经常被误解,但是它可能会产生非常不同的影响。

这些问题可能导致以下一些性能问题:

示例 1:增加内存使用量

bulk_max_size: 50
flush.timeout: 10s
flush.min_events: 1500

最大的问题是内存使用。在 8.13 版本之前,队列一次管理一个完整的缓冲区的内存。在此示例配置中,一个完整的事件缓冲区可以提供 30 个输出批次,每个批次 50 个事件。这意味着我们需要完全处理 30 个批次,才能释放最初那一个批次的内存!

示例 2:增加延迟

bulk_max_size: 100
flush.timeout: 5s
flush.min_events: 200

假设输出请求 100 个事件。队列中有 100 个事件,但在填满 200 个事件的完整缓冲区之前,它不会返回任何事件。如果不再有更多事件进来,它将等待整整 5 秒才返回任何事件,尽管请求本可以立即得到满足。

这一直是一个陷阱,但在 8.12 版本中,我们将默认的 flush.timeout 从 1 秒增加到 10 秒时,这个问题变得更加严重。对大多数用户来说,这提高了性能,因为大批量事件的处理更有效率。但是,那些将输出的 bulk_max_size 设置得较低的用户看到了增加的延迟,尽管理论上有足够的事件可以立即开始处理。

示例 3:事件批次变小

bulk_max_size: 100
flush.timeout: 1s
flush.min_events: 150

我们有一个队列,里面有 300 个事件,输出每次请求 100 个事件。理论上,我们应该能够将 300 个事件作为三批每批 100 个事件发送,但队列的缓冲区大小为 150 个事件,队列一次只从一个缓冲区返回事件。因此,实际上发生的是每个缓冲区被分成两批 —— 一批 100 个事件和一批 50 个事件。

对于大多数配置来说,即使队列中还有更多事件,输出工作者偶尔也会得到比其请求的少的事件。这不足以造成巨大差异,但略微降低了效率,如果我们每次都能返回正确数量的事件,那将会更好。

我们对此做了什么

我们最终重写了队列,完全删除了内部缓冲区的链条。相反,我们现在使用一个固定的单一缓冲区,根据需要在末尾循环。事件也从这个共享缓冲区中复制出来,以组装输出批次。现在,flush.timeout 的工作方式与大多数人预期的完全一致:如果请求的事件可用,队列将立即返回请求的数量的事件,否则它将等待达到指定的超时时间来填充请求(但仅限于当前请求,而不是某些更大的内部限制!)。

这次重构需要做出一个妥协,即原始队列试图避免的 —— 事件批次不再是内存中的单个连续序列。但作为交换,我们得到了巨大的好处:

  • 示例一中的内存问题已经消失。一旦输出确认了一批事件已经被处理,队列就可以释放它的内存,不管它相对于其他事件批次的位置如何。
  • 示例二中的延迟问题已经消失。如果队列有足够的事件,它将返回它们。它们在事件序列中的位置已经不重要了。
  • 示例三中的批处理大小问题已经消失。由于事件不再需要来自一个连续的缓冲区,我们不需要根据内部内存边界来分割批次。

flush.min_events 现在是一个遗留参数,为了向后兼容性,它指定了事件批次大小的全局最大值。如果你使用的是性能预设(performance preset),则可以完全忽略此参数,但现在建议自定义队列配置将其设置为一个大值,并使用 bulk_max_size 来控制批次大小。只要 flush.min_events 足够大,再也没有改变它的性能优势了。

结果

在我们的内部基准测试中,我们发现对于所有预设(presets),都实现了显著的内存节省(这些差异是通过使用 Filebeat 在结构化 JSON 事件上进行文件流输入进行测量的):

PresetMemory savings
balanced17%
throughput18%
scale18%
latency24%

所有预设还显示出每个事件的 CPU 成本减少了3%。

性能预设的回报

通过为常见的性能目标定义内置预设,我们大大减少了配置 Elastic Agent 和 Beats 时的猜测工作。现在我们正在看到后续的好处,因为这为我们的优化工作提供了一组常见的配置目标。期望这些改进将在 8.14 版本及以后继续!

Elastic 8.13 中还有什么新功能?请查看 8.13 版本的发布公告以了解更多信息>>

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

原文:Improving the event queue in Elastic Agent and Beats | Elastic Blog

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

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

相关文章

喜讯|我司再次获得国家发明专利,硬核科技研发成果呈加速度增长

热烈祝贺 璞华软件成功获得国家发明专利 我司自主研发成果《一种工伤案件裁决书的生成方法及装置》(专利号:ZL 2019 1 1170975.8)成功获得国家发明专利,2024年4月成功获得专利证书。 发明人:高志凯;杨德…

微商商城源码小程序好用么?

商城APP作为电子商务行业的重要组成部分,已经成为了人们购物的主要方式之一。为了在竞争激烈的市场中脱颖而出,开发一款专业且思考深度的商城APP方案显得尤为关键。本文将从专业性和思考深度两个方面,探讨商城APP的开发方案。 一、专业性的重…

BGI | STCellBin:动植物组织细胞分割

简介 STCellbin 利用细胞核染色图像作为桥梁来获取与空间基因表达图谱对齐的细胞膜/壁染色图像。通过采用先进的细胞分割技术,可以获得准确的细胞边界,从而获得更可靠的单细胞空间基因表达谱。此次更新的增强功能为细胞内基因表达的空间组织提供了宝贵的…

uc网盘推广拉新渠道

​近期,UC网盘拉新项目在收益上展现出了一些明显的优势,这些优势对于推广者来说是非常吸引人的。以下是对这些优势的详细分析: 上手容易:与其他项目相比,UC网盘的报备审核过程相对宽松,速度也更快。在快节奏…

Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey

Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey PDF: https://arxiv.org/pdf/2403.14608.pdf 1 概述 大型模型在多个领域取得了显著进展,但它们的大规模参数带来了高昂的计算成本。这些模型需要大量资源来执行,尤其是在针…

【python】__name__函数的用法详解!

上一篇中,说到了__init__函数的使用,__init__函数是在类中实现,它在创建对象时自动执行,用于初始化对象的属性。今天我们来说一下__name__函数,__name__函数的主要作用为: 1.执行python脚本 2.导入到别的…

哪种裤子比较百搭?显高显瘦的男生裤子分享

选到合适的裤子才能穿得好看以及舒服。可是市面上也出现了不少各种裤子质量达不到标准的负面新闻,为了能够选到合适的裤子,我自费购买了多个品牌的裤子测评。之后我知道很多网红品牌为了压低成本,用料和做工都很差,于是我总结了五…

Python和Java哪个更适合后端开发?

Python和Java都是强大的后端开发语言,它们各自有鲜明的特点和适用场景。选择哪一个更适合后端开发,主要取决于具体的项目需求、团队技术栈、个人技能偏好以及长期发展考虑等因素。 下面是两者在后端开发中的优势和劣势: 「Python&#xff1…

TCP/IP协议—TCP

TCP/IP协议—TCP TCP协议TCP通信特点TCP技术概念TCP定时器 TCP头部报文TCP连接三次握手(建立连接)四次挥手(释放连接)连接状态 TCP协议 传输控制协议(TCP,Transmission Control Protocol)是一种…

《柳叶刀》子刊:突破性临床试验,证实粪菌移植治疗帕金森病的潜力

帕金森病(Parkinson’s Disease,PD),是一种复杂的神经退行性疾病,也是世界上第二常见的神经退行性疾病,仅次于阿尔茨海默病(AD),影响着约1%-2%的65岁及以上老人。随着全球…

Ribbon-负载均衡原理解析(案例)

简介:负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同…

明厨亮灶厨师帽佩戴检测的难点与优化方式 Yolov5+bytetrack

随着国家一系列食品安全政策的出台,厨房的安全卫生问题逐渐被人们重视。其中,工作人员是否佩戴厨师帽是很关键的一环。人们希望能通过一种方式实现自动化的检测,但目前市场上大部分“明厨亮灶系统”或“未佩戴厨师帽检测系统”都无法满足用户…

【UE5.1】使用MySQL and MariaDB Integration插件——(1)连接MySQL

效果 步骤 1. 在虚幻商城下载“MySQL and MariaDB Integration”插件 2. 购买安装后,我们将插件添加到一个新工程中,打开新工程可以看到已经添加了插件 3. 新建一个蓝图,选择父类为“MySQLDBConnectionActor” 这里命名为该蓝图为“BP_MySQL…

腾讯测试岗位的面试经历与经验分享【一面、二面与三面】

腾讯两个月的实习一转眼就结束了,回想起当时面试的经过,感觉自己是跌跌撞撞就这么过了,多少有点侥幸.马上腾讯又要来校招了,对于有意愿想投腾讯测试岗位的同学们,写了一些那时候面试的经历和自己的想法,算不上经验,仅供参考吧! 一面 — —技术基础,全面…

linux 自定义命令/别名

参考资料 Linux(Ubuntu)自定义命令的使用Linux/Ubuntu系统自定义Shell命令Ubuntu/Linux 操作系统 自定义命令 目录 一. 为路径取别名二. 修改.profile文件2.1 .profile简介2.2 需求2.3 修改.profile文件 三. 创建软链接 一. 为路径取别名 ⏹需求:有一个work文件夹…

API网关工具Kong或nginx ingress实现对客户端IP的白名单限制,提高对外服务的访问安全

一、背景 部署在生产环境的应用,供内部服务调用外,还需要暴露外网访问。 比如consul ui管理界面,我们需要给到开发和测试人员,观察服务的注册情况。 再比如前端页面和后端接口在一起的服务,后端接口供内部服务接口调用…

蓝桥杯备赛刷题——css

新鲜的蔬菜 这题需要使用grid 我不会 去学一下 一.什么是grid Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。 Flex 布局是轴线布局,只能指定"项目"针对轴线的位置&#…

XTTS数据迁移方案

前置条件检查 XTTS使用限制较多,V3版本按照本节逐项检查 目标库操作系统不能是windows 源库:redhut 7.9 目标库:redhut 7.9 检查数据库时区(两边都需要) SQL> select dbtimezone from dual; 检查结果两边都一致…

自然语言处理NLP关键知识点

大家好,在人工智能出现之前,机器智能处理结构化的数据,例如 Excel 里的数据。但是网络中大部分的数据都是非结构化的,例如文章、图片、音频、视频等。在非结构数据中,文本的数量是最多的,他虽然没有图片和视…

Compose UI 之 Card 卡片组件

Card Card 是用于显示带有圆角和可选阴影的矩形内容容器。它通常用于构建用户界面,并可以包含标题、文本、图像、按钮等元素,表示界面上的可交互元素,我们称它是 “卡片”。 Card 使用的一些经典的场景: 列表数据,例如 新闻列表,产品列表等。信息提示框,使用 Card 组件…