记一次ES写入优化

背景:

我们系统通过ES存储告警数据,性能测试过程中测试反馈有一台单机环境ES数据有延迟,随着运行时间增长,延迟越来越明显,影响了正常功能需要解决。于是我们开始对整个数据出流程进行分析

定位问题:

第一反应系统可能是因为在进行性能测试数据量比较大某个数据处理环节性能达不到出现了数据堆积,于是对数据处理的流水线进行分析,查看了数据采集组件、数据标准化模块、数据分析组件、关联分析组件,发现数据处理都没有延迟,数据写入kafka也很正常没有时延,最后发现是数据写入ES时候出现了延迟。通过查看kafka消费者状态
在这里插入图片描述
消费者lag非常多,消费能力不足,导致数据延迟,现象也很明显,消费者速度跟不上生成数据速度导致数据积压发生延迟。消费者处理数据流程是将数据按条件进行聚合然后写入ES,通过日志分析发现,聚合处理速度非常快无性能问题,而聚合后数据写入ES占据了大部分的数据处理时间,基本可以确定是数据写入ES速度较慢,导致数据积压,时间延迟。

优化过程:

ES数据写入是既涉及到CPU的计算也涉及到IO处理。首先考虑从代码层面进行优化

  • 使用批量写入。ES批量写入性能比单条写入性能更高,当有大量数据写入ES的时候应该使用bulk api写入数据,查看代码发现已经使用了bulk写入数据。针对批量请求合理的控制每个批量请求大小,虽然批量请求能提高效率,但过大的批请求可能会导致内存问题或阻塞。根据集群性能和节点配置,通常建议一个请求包含数千条记录。
  • 减少锁的粒度。因为告警数据写入ES后支持修改、删除和重计算逻辑,数据聚合生成告警数据过程需要保证安全性,原本会通过redis实现一个全局锁来保证整个数据聚合处理的独占性,如果正在对告警数据进行其他操作时会导致聚合处理逻辑阻塞
    在这里插入图片描述
    根据业务逻辑分析告警都是以资产为单位,在处理、重计算的时候也是根据资产进行处理,于是我们对之前的全局锁进行优化,修改为以资产为维度进行加锁,这样可以缩小锁的范围,减少数据处理阻塞的时间
  • 使用线程池。将原来数据ES写入逻辑改为多线程处理,我们将数据进行分批,交给不同的线程池进行写入,经过测试性能有所提示,但是在测试过程中发现服务有出现内存溢出问题,当前平台内存仍有剩余,经过评估可以适当扩大内存,长稳测试后服务运行正常
  • 使用缓存(经过评估方案没有落地)。数据流经过关联分析后会生成一次安全事件,但是由于数据流中会存在相同时间相同类型等条件的重复一次告警,不利于当前状态展示。于是对一次告警进行二次分组聚合,聚合后的二次告警会先查询ES中是否已经存在,如果存在则对历史数据部分字段进行修改,如果不存在则直接写入ES。在一次告警比较少时无明显影响,但是当一次告警比较多的时候每一条告警都需要查询一次ES影响较大。单条查询几毫秒-几十毫秒之间,但每批数据量在2000条左右,整个处理流程需要几十秒,导致数据积压。每条数据既需要对ES进行查询操作也要进行写入操作,肯定会影响写入性能。那哪种技术适合当前场景呢,首先考虑到使用布隆过滤器判断ES中是否已经存在,不用直接查询ES,但是我们的需求有过期数据清理的逻辑,而布隆过滤器对删除支持不好,如果支持删除需要使用计数布隆过滤器,但是空间使用效率不是很高。经过调研可以使用布谷鸟过滤器,对删除支持比较好,空间使用效率也比较高,实现方案其实也是通过redis实现。
    ES配置调整
  • 修改elasticsearch.yml配置。根据自己的环境进行修改,我们主要修改了两个参数
thread_pool.bulk.size
thread_pool.bulk.queue_size
  • 修改jvm.options。同样根据自己的环境进行配置,我们主要是修改了,针对netty的优化
-Dio.netty.noUnsafe
-Dio.netty.noKeySetOptimization
-Dio.netty.recycler.maxCapacityPerThread

上面两种参数配置在我们环境修改后有所提升但是不太明显,可以根据自己情况进行调整
ES索引配置调整

  • 修改索引的refresh间隔
curl -XPUT "http://elastic1:9200/index_name/_settings?timeout=60s" -H 'Content-Type: application/json' -d '
{
  "index": {
	"refresh_interval": "5s"
  }
}'

ES中有个很重要的概念就是refresh,数据写入内存需要执行refresh操作后才能变为被搜索到,默认情况下ES会每秒执行一次自动刷新,这些在内存中的数据会被写入一个新的段,新写入的数据会在1秒钟内变为可搜索的,这个过程就是refresh。因为refresh会带来I/O操作和CPU负载,频繁的刷新也会影响索引性能,如果是不需要近实时的搜索场景可以将refresh适当放大一点。在我们系统中聚合数据写入ES后会通知下游处理逻辑,为了数据可见性我们将数据refresh间隔设置为5s,并且会延迟5s后发送消息通知下游组件防止数据查询不到。

  • 修改索引translog提交方式为异步提交

ES通过translog来保证操作不丢失也叫事务日志,translog在索引恢复的时候也可以缩短恢复时间,在每一次对 ES进行操作时均进行了日志记录,translog是顺序写入的所以写入性能很高。一个文档在写入索引之后,就会被添加到内存缓冲区,并且追加到translog中,每隔一段时间随着translog文件越来越大,一个新的translog文件会被创建并执行一次全量的提交及将内存中的数据写入磁盘。在translog文件被 fsync 到磁盘前,如果发生重启则被写入的文件就会丢失,因此如果你的系统对于丢失 sync_interval 时间段的数据也无所谓,那将translog的刷盘操作修改为异步对写入性能提高很有帮助,虽然sync_interval设置的很小,但是如果是批量写入数据系统宕机情况下丢失数据量也是很大的,需要慎重依据自己的场景使用,避免数据丢失。

curl -XPUT "http://elastic1:9200/index_name/_settings?timeout=60s" -H 'Content-Type: application/json' -d '
{
  "index": {
	"translog.durability": "async",
    "translog.sync_interval": "1s"
  }
}'

选择合适的I/O调度算法
我们使用工具对操作系统运行状态进行分析:服务器CPU内存磁盘运行指标监控工具
在这里插入图片描述
内存使用正常,cpu使用率正常,但是可以看到有大量的iowait说明磁盘写入有性能瓶颈,查看磁盘的调度算法

cat /sys/block/vdb/queue/scheduler 

在这里插入图片描述
使用分析工具对none和deadline两种调度算法进行采样
在这里插入图片描述
然后对比两种不同调度算法I/O数据,两种调度算法结果如下:
none调度算法:
在这里插入图片描述
deadline调度算法:
在这里插入图片描述
经过对比我们发现

  • BLKavg: 从平均块大小看,Deadline 的 228 比 None 的 136 大,这表示每次合并的请求更大
  • NSEEKS: Deadline 调度的寻道次数为 891384,略少于 None 的 1187328。
  • MODE: 空闲模式的频率(0)在 Deadline 中下降至 858293,表明更多请求是顺序或近似顺序的
  • NSEEKS: Deadline 的寻道次数是 791544,比 None 的 1179096 少,显示出在物理层面请求的有效调度
    总结:
    Deadline 调度算法倾向于通过增加合并和较大块的请求来提高效率,同时在一些情况下可能导致队列等待时间的增大。Deadline 调度着重于减少 I/O 请求延迟、优化吞吐量,并保持系统的响应速度,在可能增加一定排队延迟的情况下提升整体 I/O 性能。
记录一次es写数据延迟引发的问题 es更新延迟引发的问题及解决 阅读详情

相关推荐

记一次Elasticsearch查询性能优化

  背景:在数据和服务都准备完成的情况下,打开页面,发现请求需要要几秒才返回; 思路:1.查看搜索接口请求本身耗时情况,排除网络抖动因素,发现搜索接口请求到ES返回结果本身耗时较高; 2.检查每次请求到ES的入参,并在原有参数中加入"profile": true,查看ES处理搜索请求的耗时分布情况; 入参: 返回: 发现只是一个简单的termQuery耗时818ms,然后查看是...

my201110lc的博客 2万+

7、记一次 Elasticsearch 数据结构设计不合理造成的写入超时问题

记一次 Elasticsearch 数据结构设计不合理造成的写入超时问题

小确幸的博客 961

(Elasticsearch)ES写入性能优化方案

在ES的默认设置下,是综合考虑数据的可靠性,搜索实时性,写入速度等因素的。当离开默认设置,追求极致写入速度时,很多是以牺牲可靠性和搜索实时性为代价的。有时候,业务上对数据可靠性和搜索实时性要求不高,反而对写入速度要求很高,此时可以调整一些策略,最大化写入速度。 综合来说可以从以下几个方面入手: 加大translog flush间隔,目的是降低iops,writeblock (可靠性降低) 加大index refresh间隔,除了降低I/O,更重要的是降低segment merge频率 调整bulk

wangxuelei036的博客 1万+

ES常见问题

目录 1.修改某个索引的分片数 2.es 写入超时 3.重索引 4.es常用命令 5.华为云es开启安全模式,客户端使用方法 6.运维的一些命令 7.新加Es节点操作 8.由tranlog引起的文件句柄过多问题解决 1.修改某个索引的分片数 #其中, index_patterns 表示要匹配的索引名 #"order": 1 ,这个值,在的会overwite小的值,eg: 默认的es_tempate一般我们都配置为0,这个什为1,那个这值里面的所以参数都会overwirte 值为0的参数

weixin_44024436的博客 5585

Elasticsearch写入速度优化

文章目录背景translog flush间隔调整索引刷新间隔refresh_interval段合并优化indexing buffer使用bulk请求bulk线程池和队列并发执行bulk请求磁盘间的任务均衡节点间的任务均衡索引过程调整和优化自动生成doc ID调整字段Mappings调整_source字段禁用_all字段对Analyzed的字段禁用Normsindex_options设置 背景 在ES的默认设置下,是综合考虑数据可靠性、搜索实时性、写入速度等因素的。有时候,业务上对数据可靠性和搜索实时性要求并

qq_27639777的博客 2382

es写入磁盘的过程以及相关优化

commit(flush)程分为以下几步:7.1 Memory buffer清空并且Refresh7.2 调用fsync, 将FileSystemCache中的Segments写入磁盘7.3 清空删除translog重启一个新的translogES利用这个commit point来决定哪些Segments属于当前shard。Commit point和Segments的关系如下这里有两个知识点根据之前数据写入过程分析我们可以看到,如果数据已经写入了Filesystem cache, 那么数据就能被搜索到了,

CharlesYooSky的博客 1326

Elasticsearch:从写入原理谈写入优化

1、线上实战问题问题 1:想要请问一下,我这边需求是每分钟利用 sparksteaming 插入按天的索引150万条数据。一般情况下还好,索引7个分片,1副本,但是偶尔会出现延迟很高的情况...

铭毅天下Elasticsearch 8772

六、海量hive数据写入es优化

场景: 业务部门将客户画像结果表通过hive映射到es表,其中结果表600W条数据,但每条数据接近2W个标签,数据入到es后主要场景是多字段组合过滤查询后聚合求和。 优化思路 es默认最大字段数是1000,需要增大字段数 hive端优化: hive的取数据的速度大于写入到es的速度,es会由于集群规模问题或者资源问题无法同时接收hive过多的并发数。 由此hive端主要优化是减小map数 set...

weixin_43053022的博客 4211

记一次ES搜索引擎对响应结果排序优化

记一次ES搜索引擎对响应结果排序优化 author: codezhao 1.需求:根据关键词分页搜索小说名称,排序优先响应和关键字前缀相同的小说名称 如果我们按照ES默认的相关度分数排序,写法如下: //条件 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.must(QueryBuilders.termsQuery("status", "1")); QueryBuilders.wildcardQuery("boo

zhao19191919的博客 1342

【es】将 elasticsearch 写入速度优化到极限

1.概述 转载:将 elasticsearch 写入速度优化到极限 基于版本: 2.x – 5.x 在 es 的默认设置,是综合考虑数据可靠性,搜索实时性,写入速度等因素的,当你离开默认设置,追求极致的写入速度时,很多是以牺牲可靠性和搜索实时性为代价的.有时候,业务上对两者要求并不高,反而对写入速度要求很高,例如在我的场景中,要求每秒200w 条的平均写入速度,每条500字节左右 接下来的优化基于集群正常运行的前提下,如果是集群首次灌入数据,可以将副本数设置为0,写入完毕再调整回去,这样副本分片只需要拷贝.

九师兄 4529

从写入原理深入elasticsearch写入优化

这里写目录标题默认一秒的刷新频率,秒级可见(用户无感知)设置了60s的刷新频率60s后才可以被搜索到 1、线上实战问题 问题 1:想要请问一下,我这边需求是每分钟利用 sparksteaming 插入按天的索引150万条数据。一般情况下还好,索引7个分片,1副本,但是偶尔会出现延迟很高的情况。比如:一般情况下1分钟插入150万能正常插入,可能突然就出现了需要5分钟才能插入成功,然后又正常了。很头疼。 请问这种情况我需要怎么去查看一下是否正常。我已经把副本设置成了0,还把批量插入的参数从 5000 设置成 2

yonggeit的博客 18万+

elasticsearch 的一次写入数据的过程

从官方文档上可以看到的是,官方推荐我们在搭ES集群的时候,留一半以上的内存给lucence,还说lucence是基于filesystemcash的。 我们可以从一次ES的写入数据的过程来看看为什么要这样做,以及里边的一些优化点。 # # ES的写入过程 我只用文字来描述一个大题上的流程:将数据写入到Lucence;定时进行一个refresh操作,将Lucence的数据写入到文件系统缓存中,然后最后再写入到磁盘中。 详细介绍:我们调用一次写入的api...

Angus 1366

Elasticsearch进阶(一)写入性能基准测试写入性能优化

进入正题之前,解决之前的一个疑问:Elasticsearch集群是否已经正确工作?截图时,只上传过一次小测试数据(143万条),设置为:从图中可以看出,ip10节点上设置的数据目录:data1和data2目录工作正常,但是数据相同ip12中数据与ip10中数据不同,但是data1与data2数据相同ip13数据与ip12相同ip11既不是master候选者,也不是data节点,验证发现确实无数据分配多个分片和副本是分布式搜索功能设计的精髓系统:macOS10.13.4处理器:2.3GhzInterCorei5内存:8GB2133MHzLPDDR3SSDs注:jamesjxin在博客中说到:确保

elasticsearch写入优化

elasticsearch写入优化

qq_41201565的博客 1051

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 187

南京银行信息技术岗提前批笔试与面试

1、笔试 笔试大致可以分为三部分:性格测试、行测题目、专业知识 性格测试 性格测试一般会有较多的体量,可能一共大概有一百多道接近两百道的样子,这个是不限时的。 前面有100道是这样的题目,就是有四个选项都是各种形容词,然后分别选出最符合自己的与最不符合自己的选项。这种题你就顺着自己的潜意识填就行了,但是前后要一致,我怀疑他出这么多题,可能就是考一考你记不记得前面填了啥。比如你做到第90题的时候,可能会出现和前面第2题类似的四个形容词,更有甚者就是一模一样的,你要对自己之前选的什么有个比较清楚的记忆。

qq_40971025的博客 6920

ES的写入速度优化

1、tranlog flush 间隔调整 默认设置下,每个请求都flush,这是影响es写入速度的最大因素,需要调整translog持久化策略为周期性和一定大小的时候flush,例如: index.translog.durability: async 设置为async表示translog的刷盘策略按sync_interval配置指定的时间周期进行。 index.translog.sync...

qq_29860591的博客 4730

离心泵级间导叶的设计计算

离心泵级间导叶的设计计算高速离心泵级间流道的作用是将第一级复合叶轮流出的高速液流收集起来并送入第二级复合叶轮。级间流道的设计应考虑降低液体的流速,实现动能向压力能转化,减小液体的水力损失。级间流道主要有蜗壳形流道和导叶两种结构形...

cqzc55322的博客 2565

Elasticsearch专栏-8.es读写性能及优化

es读写性能及优化

zjun1001的博客 7802

创建 Qt Quick 项目

来看看如何使用 Qt Creator 创建 Qt Quick 项目!

青春不老,奋斗不止! 1万+

【BlueDroid】【BLE】低功耗蓝牙客户端和服务端开发流程解析(超详细)

1. 精讲):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论2. 欢迎大家关注和订阅,和专栏会持续更新中.....敬请期待!

风云说通信 1924

ElasticSearch优化实战:滴滴ES千万级TPS写入性能翻倍

问题导读: 1、如何进行写入瓶颈分析? 2、如何进行性能优化? 3、如何优化写入模型? 4、单节点写入能力如何提升?滴滴ElasticSearch平台承接了公司内部所有使用ElasticSearch的业务,包括核心搜索、RDS从库、日志检索、安全数据分析、指标数据分析等等。平台规模达到了3000+节点,5PB 的数据存储,超过万亿条数据。平台写入的峰值写入TPS达到了2000w/s,每天近 10 亿次检索查询。为了承接这么大的体量和丰富的使用场景,滴滴ElasticSearch需要解决稳定性、易用性、性能、

ytp552200ytp的博客 2141

华为OD机试 - 进制转换 - 二进制(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 915

ElasticSearch写入性能优化

ES提高写入性能的目标 增大写吞吐量,越高越好 基本原则 客户端:多线程,批量写 可以通过性能测试,确定最佳文档数量 多线程:需要观察是否由HTTP429返回,实现Retry以及线程数量的自动调节 服务器端:先分解问题,在单个节点上测试调整以达到最高吞吐量 使用更好的硬件(通过观察CPU/IO Block) 线程切换/堆栈状况 服务器端优化写入性能的一些手段 降低IO操作 使用ES自动...

wang_wpw的专栏 3047

制作3D地形图的方法-使用GlobalMapper和3ds Max软件

打开GlobalMapper软件,在菜单栏中选择“文件”>“打开数据文件”,然后选择相应的高程数据文件。在菜单栏中选择“渲染”>“渲染设置”,根据需要进行设置,如分辨率和输出格式。选择地形对象,点击菜单栏中的“渲染”>“材质编辑器”,然后根据需要调整材质属性,如颜色、纹理和光照等。在菜单栏中选择“工具”>“高程栅格和网格”>“创建地形网格”。在菜单栏中选择“文件”>“导出”>“导出栅格格式”。打开3ds Max软件,在菜单栏中选择“文件”>“导入”,然后选择之前导出的地形数据文件。步骤3:导出地形网格。

JqlScala的博客 1535

中远麒麟堡垒机 SQL注入漏洞复现

中远麒麟堡垒机/baoleiji/api/tokens接口处存在sql注入漏洞,未经身份认证的攻击者可通过该漏洞获取数据库敏感信息及凭证,最终可能导致服务器失陷。

0xSec 2994
上一篇: lucene数据写入-03数据刷盘
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值