荆州松滋网站建设/登封搜索引擎优化

荆州松滋网站建设,登封搜索引擎优化,泰安网站设计,呼和浩特做网站的公司有哪些👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch批量写入性能调优实战:2.2.3 案例:电商订单日志每秒10万条写入优化1. 原始架构与瓶颈分析1.1 初始集群配置1.2 性能瓶颈定位 2. 全链路…

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • Elasticsearch批量写入性能调优实战:2.2.3 案例:电商订单日志每秒10万条写入优化
    • 1. 原始架构与瓶颈分析
      • 1.1 初始集群配置
      • 1.2 性能瓶颈定位
    • 2. 全链路优化方案设计
      • 2.1 优化架构全景图
      • 2.2 优化措施矩阵
    • 3. 分阶段性能调优实施
      • 3.1 第一阶段:硬件与基础配置
      • 3.2 第二阶段:写入客户端优化
    • 4. 压力测试与效果验证
      • 4.1 测试环境
      • 4.2 调优效果对比(核心指标优化对比)
    • 5. 生产环境稳定性保障
      • 5.1 动态限流配置
      • 5.2 监控报警策略(生产环境监控报警矩阵)
    • 经验总结与避坑指南
      • 关键成功要素
      • 典型避坑指南
    • 最终效果

Elasticsearch批量写入性能调优实战:2.2.3 案例:电商订单日志每秒10万条写入优化


1. 原始架构与瓶颈分析

1.1 初始集群配置

组件配置详情问题表现
ES集群6节点(8C32G),HDD RAID5磁盘IO持续100%
索引设计15主分片/1副本,默认refresh_interval段合并风暴
写入客户端单线程批量提交,每次500条CPU利用率不足30%
JVM配置16GB堆,CMS GCGC停顿频繁(>2秒/分钟)

1.2 性能瓶颈定位

# 热点线程分析# 此请求用于获取 Elasticsearch 集群中各节点的热点线程信息# 热点线程是指在一段时间内占用大量 CPU 时间的线程# 通过分析热点线程,可以找出可能存在性能瓶颈的线程,例如哪些线程在频繁执行复杂的操作,从而定位性能问题的根源
GET /_nodes/hot_threads# 资源监控数据节点 CPU 利用率:75% (us 40%, sy 35%# 节点 CPU 利用率表示当前节点的 CPU 被使用的比例,这里为 75%,说明 CPU 处于较高的负载状态# "us" 代表【用户空间】 CPU 使用率,为 40%,表示用户进程占用 CPU 的时间比例# "sy" 代表【系统空间】 CPU 使用率,为 35%,表示操作系统内核进程占用 CPU 的时间比例# 较高的 CPU 利用率可能会导致系统响应变慢,需要检查是否有大量的复杂查询、数据处理或其他高 CPU 消耗的操作在运行磁盘 IO 等待:92%# 磁盘 IO 等待表示磁盘 I/O 操作导致线程等待的时间比例,这里达到了 92%# 这意味着大部分时间线程都在等待磁盘完成读写操作,说明磁盘 I/O 可能成为系统的瓶颈# 可能的原因包括磁盘性能不足、磁盘负载过高、数据存储不合理等,需要对磁盘进行优化,如更换高性能磁盘、优化数据存储策略等VM Old GC 频率:8 /分钟# JVM(Java 虚拟机)的 Old GC 即老年代垃圾回收# 频率为 8 /分钟,说明 JVM 老年代垃圾回收比较频繁# 频繁的老年代垃圾回收会导致系统暂停,影响系统的性能和响应时间# 可能是由于堆内存分配不合理、存在内存泄漏、大对象频繁创建等原因导致,需要调整 JVM 堆内存配置、检查代码是否存在内存泄漏问题线程池 bulk 队列拒绝数:1200/分钟# 线程池 bulk 队列用于存储等待被批量操作线程池处理的请求# 拒绝数为 1200/分钟,意味着每分钟有 1200 个批量操作请求由于队列已满而被拒绝# 这可能是因为批量操作请求过多,而线程池的处理能力有限或者队列大小设置不合理# 需要增加线程池的线程数量、扩大队列大小或者优化批量操作的请求频率
  • 关键瓶颈诊断:
      1. 磁盘IO瓶颈:HDD顺序写入速度仅120MB/s
      1. 批量处理效率低:单线程客户端无法利用多核
      1. 索引配置不合理:频繁refresh导致大量小段
      1. 内存压力大:默认JVM配置导致频繁GC
参数名默认策略(Elasticsearch原生默认行为)动态调整范围(是否支持运行时修改及限制条件)监控指标(对应Metricbeat/API监控指标名称)风险场景
core固定为CPU核心数需重启生效thread_pool.bulk.active数值过小导致CPU利用率不足
max等于core(禁用弹性扩容)需重启生效thread_pool.bulk.threads设置过高引发线程竞争
keep_alive固定30秒支持动态调整thread_pool.bulk.largest过短导致频繁线程创建/销毁
queue_size固定200可动态调整(需关闭auto_queue)thread_pool.bulk.queue过大导致OOM,过小触发拒绝
auto_queue自动调整队列(初始200→max 100000)运行时自动调节thread_pool.bulk.rejected突发流量时可能误判

2. 全链路优化方案设计

2.1 优化架构全景图

在这里插入图片描述

2.2 优化措施矩阵

优化维度具体措施预期收益
硬件升级HDD -> NVMe SSD磁盘IO提升10倍
索引设计动态模板+时间序列优化写入吞吐+50%
写入客户端多线程批量+自动重试机制CPU利用率提升3倍
集群配置独立协调节点+专用Ingest节点拒绝率降为0
JVM调优G1GC+堆内存调整GC停顿减少80%
流量控制基于Kafka的削峰填谷峰值处理能力2倍
  • G1GCGarbage First Garbage Collector)是 Java 虚拟机(JVM)中的一种垃圾回收器,Java 9 中成为默认的垃圾回收器。
    • G1GC 是一款面向服务器端应用的垃圾回收器,旨在满足大内存、多处理器系统的需求。主要目标是在尽可能减少停顿时间的同时,保持较高的吞吐量与传统的垃圾回收器(如 CMS、Parallel GC 等)不同,G1GC 采用了基于 Region 的内存管理方式和标记 - 整理算法。

3. 分阶段性能调优实施

3.1 第一阶段:硬件与基础配置

# elasticsearch.yml 核心修改# 优化 Elasticsearch 集群的性能,以适应特定的业务需求和硬件环境# "thread_pool.bulk" 用于配置批量操作线程池的相关参数# 批量操作(如使用 Bulk API 一次性处理多个文档的索引、更新或删除操作)是 Elasticsearch 中常用的操作方式,合理配置该线程池能提高批量操作的效率
thread_pool.bulk:# "size" 定义了批量操作线程池中的线程数量# 这里设置为 32,是基于每个节点有 16  CPU,乘以 2 意味着线程池的线程数量是 CPU 核心数的 2 # 这样设置的目的是充分利用 CPU 资源,让更多的线程同时处理批量操作请求,但又不会过度创建线程导致系统资源耗尽size: 32          # 16核CPU × 2# "queue_size" 表示批量操作线程池队列的最大容量# 当有大量的批量操作请求进入系统,且线程池中的线程都在忙碌时,新的请求会被放入队列中等待处理# 这里将队列大小设置为 2000,意味着队列最多可以容纳 2000 个批量操作请求# 如果队列满了,新的请求可能会被拒绝,需要根据实际的业务流量和处理能力来调整这个值queue_size: 2000# "indices.memory.index_buffer_size" 用于设置索引缓冲区的大小# 索引缓冲区是 Elasticsearch 用于临时存储待索引文档的内存区域# 设置为 30% 表示将堆内存的 30% 分配给索引缓冲区# 较大的索引缓冲区可以减少磁盘 I/O 操作,提高索引性能,但也会占用更多的堆内存,可能会影响其他操作的性能# 需要根据系统的内存资源和业务的索引频率来合理调整这个比例
indices.memory.index_buffer_size: 30%# 索引模板配置# 索引模板用于定义新创建索引的默认设置和映射# 这里创建了一个名为 "orders" 的索引模板,当创建与该模板匹配的索引时,会自动应用模板中的设置
PUT _template/orders
{"settings": {# "number_of_shards" 定义了每个索引的主分片数量# 这里设置为 30,意味着每个新创建的与 "orders" 模板匹配的索引将有 30 个主分片# 增加主分片数量可以提高数据的并行处理能力和集群的扩展性,但也会增加集群的管理开销和资源消耗# 需要根据数据量、查询需求和集群规模来合理设置主分片数量"number_of_shards": 30,# "refresh_interval" 表示索引的刷新间隔# 这里设置为 "30s",意味着每隔 30 秒,索引会将内存中的数据刷新到磁盘上,使其可以被搜索到# 较长的刷新间隔可以减少磁盘 I/O 操作,提高索引性能,但会增加数据的可见延迟# 需要根据业务对数据实时性的要求来调整刷新间隔"refresh_interval": "30s",# "translog.durability" 用于设置事务日志的持久化策略# 这里设置为 "async",表示事务日志将异步刷新到磁盘# 异步刷新可以提高索引性能,但在发生故障时可能会丢失部分未刷新到磁盘的事务日志数据# 如果对数据的持久性要求较高,可以将其设置为 "request",表示每次请求都将事务日志同步刷新到磁盘"translog.durability": "async"}
}
  • 硬件升级方案:
    • 数据节点:12台(32CPU128G,2TB NVMe × 4 RAID0)
    • 协调节点:3台(16CPU64G,仅处理HTTP请求)

3.2 第二阶段:写入客户端优化

// 多线程BulkProcessor配置BulkProcessor bulkProcessor = BulkProcessor.builder(client::bulkAsync, new BulkProcessor.Listener() { /* 监听器 */ }).setBulkActions(2000)      // 2000文档提交.setBulkSize(new ByteSizeValue(10, ByteSizeUnit.MB)).setConcurrentRequests(8)  // 并发写入线程数.build();
  • 客户端优化关键参数:
    • 并发线程数 = 协调节点数 × 2 (3×2=6,取8预留余量)
    • 单个批量大小:10MB(根据ES官方建议5-15MB)
    • 重试策略:指数退避(最大重试3次)

4. 压力测试与效果验证

4.1 测试环境

组件配置详情
压测工具自研Go语言压测工具(模拟真实订单流)
测试数据集1亿条订单数据(含28个字段)
持续时间30分钟稳态压力测试

4.2 调优效果对比(核心指标优化对比)

指标优化前优化后提升幅度
平均吞吐量35,000/s121,000/s245%
P99写入延迟1200ms230ms80%
磁盘IO利用率98%65%-
拒绝请求数1,200/min0100%
GC停顿时间2.1s/min0.3s/min85%
  • 吞吐量趋势图:
140k ┤             ***************
120k ┤          ***               ***
100k ┤        **                     **80k ┤      **                         **60k ┤    **                             **40k ┤  **                                 **20k ┤**                                     **┼----------------------------------------5min   10min   15min   20min   25min

5. 生产环境稳定性保障

5.1 动态限流配置

# 索引级别限流(根据业务高峰动态调整)# 该操作的目的是对指定索引进行限流设置,并且可以依据业务高峰时段的不同情况动态调整限流参数,以保障 Elasticsearch 集群的稳定运行,避免因某个索引的操作过于频繁而影响整体性能。# PUT 请求用于更新资源,这里是更新名为 orders 的索引的设置。PUT /orders/_settings{# "index.rate_limit" 是用于设置索引操作速率限制的配置项。"index.rate_limit": {# "max_docs_per_second" 指定了每秒允许索引的最大文档数量。# 这里设置为 150000,表示在一秒内,对 orders 索引进行操作时,最多只能索引 150000 个文档。# 此设置可防止短时间内大量文档的涌入导致集群资源耗尽或性能下降。"max_docs_per_second": 150000,# "max_bytes_per_second" 指定了每秒允许索引的最大数据量。# 设置为 "500mb",意味着每秒对 orders 索引进行操作时,涉及的数据量不能超过 500 兆字节。# 结合文档数量限制和数据量限制,能更全面地控制索引操作的速率。"max_bytes_per_second": "500mb"}
}# 集群级别断路器# 集群级别断路器【用于防止 Elasticsearch 集群因内存使用过度而崩溃】。# 它会对某些可能消耗大量内存的操作进行限制,当达到或接近设定的限制时,会阻止这些操作继续执行。# "indices.breaker.total.limit" 是一个全局设置,用于定义整个集群中所有断路器的总内存使用上限。# 设置为 70%,表示集群中所有可能触发断路器的操作所使用的内存总和不能超过堆内存的 70%# 这样可以为集群保留一定的内存空间,用于其他必要的操作,确保集群的稳定性。
indices.breaker.total.limit: 70%

5.2 监控报警策略(生产环境监控报警矩阵)

监控指标报警阈值响应动作
bulk队列拒绝率> 0次/5分钟自动扩展协调节点
磁盘IO等待时间> 70%持续10分钟触发数据归档流程
JVM Old GC频率> 2次/分钟触发堆内存分析并扩容
节点CPU使用率> 85%持续5分钟动态降低索引refresh频率

经验总结与避坑指南

关键成功要素

    1. SSD硬件升级:NVMe SSD使磁盘IOPS从1,500提升至80,000
    1. 客户端多线程改造:写入并发从1线程提升到8线程
    1. 索引预分区策略:分片数从15增加到30(数据节点数×2.5)
    1. JVM垃圾回收调优:G1GC替代CMS,最大GC停顿从2.1s降至0.4s
    • CMSConcurrent Mark Sweep)是 Java 虚拟机(JVM)中的一种垃圾回收器,主要用于对老年代进行垃圾回收,其设计目标是尽量减少垃圾回收时的停顿时间,以提高应用程序的响应性,适合对响应时间要求较高的应用场景。
    • 是一种以获取最短回收停顿时间为目标的垃圾回收器,它基于 “标记 - 清除” 算法实现。

典型避坑指南

    1. 避免超大分片单个分片大小控制在30-50GB
    1. 禁用swap:防止内存交换导致性能断崖式下降
    1. 批量请求超时设置:建议为30s+指数退避重试
    1. 冷热数据分离:将历史数据迁移至冷节点

最终效果

  • 经过系统优化后,该电商平台在双11期间:
    • 峰值吞吐量:稳定处理12.4万条/秒订单日志
    • 资源利用率:CPU 75%、磁盘IO 65%、内存使用率70%
    • 系统稳定性:连续72小时无写入失败记录
    • 成本效益:硬件投入增加40%,处理能力提升300%

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

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

相关文章

统计Excel列中某值出现的次数

统计Excel列中某值出现的次数: 1、COUNTIF 函数用于计算满足特定条件的单元格数量。假设要统计 A 列中值为 “苹果” 出现的次数,在其他单元格中输入公式:COUNTIF(A:A,“苹果”)。其中,A:A表示要统计的范围是 A 列,&q…

Compose Multiplatform+Kotlin Multiplatfrom 第四弹跨平台

文章目录 引言功能效果开发准备依赖使用gradle依赖库MVIFlow设计富文本显示 总结 引言 Compose Multiplatformkotlin Multiplatfrom 今天已经到compose v1.7.3,从界面UI框架上实战开发看,很多api都去掉实验性注解,表示稳定使用了!…

(十一)基于vue3+mapbox-GL实现模拟高德实时导航轨迹播放

要在 Vue 3 项目中结合 Mapbox GL 实现类似高德地图的实时导航轨迹功能,您可以按照以下步骤进行: 安装依赖: 首先,安装 mapbox-gl 和 @turf/turf 这两个必要的库: npm install mapbox-gl @turf/turf引入 Mapbox GL: 在组件中引入 mapbox-gl 并初始化地图实例: <templ…

智慧园区大数据云平台建设总体方案,平台方案架构-智慧园区大数据平台(320页原件Word)

第一章 项目建设背景及现状 1.1. 项目建设背景 1.2. 项目建设必要性 1.3. 项目建设目标 1.4. 建设原则 第二章 园区创新发展趋势 2.1园区经济向生态型转变 2.2 园区企业向高新型转变 2.3园区管理向城市化转变 第三章 工业园区大数据存在的问题 3.1信息化配套设施及服…

NeurIPS24 Oral!多模态融合+目标检测全新里程碑!

最近发现多模态融合目标检测实在太热了&#xff01;顶会频出&#xff01;像是NeurIPS24 Oral上端到端算法E2E-MFD&#xff1b;ECCV24上性能提升30.8&#xff05;的FRN&#xff1b;TPAMI24上推理效率狂飙270&#xff05;倍的FSF…… 主要在于&#xff1a;一方面&#xff0c;其能…

EasyDSS视频推拉流/直播点播平台:Mysql数据库接口报错502处理方法

视频推拉流/视频直播点播EasyDSS互联网直播平台支持一站式的上传、转码、直播、回放、嵌入、分享功能&#xff0c;具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务&#xff0c;全面满足超低延迟、超高画质、超大并发访…

C语言--简单排序算法(冒泡、选择、插入)

实现三种简单的排序算法 文章目录 冒泡排序改进改进2 选择排序插入排序执行结果 冒泡排序 每次外层循环&#xff0c;排出一个最大值 void bubbleSort(int arr[], int len) {for (int i 0; i < len - 1; i) {for (int j 0; j < len - i - 1; j) {if (arr[j] > arr[…

【STM32项目实战系列】基于STM32G474的FDCAN驱动配置

前言&#xff1a;本周工作中用到了CANFD的驱动&#xff0c;由于以前都是用到的CAN2.0&#xff0c;所以过程并不是特别的顺利&#xff0c;所以中间遇到几个比较小的问题导致自己卡住了一段时间&#xff0c;特此记录一下并完全奉上自己的配置的源码。 1&#xff0c;CANFD配置与简…

解决git clone下载慢或者超时问题

在网上找了很多办法&#xff0c;直接最简单的使用镜像网站下载。 国内可用的镜像网站有&#xff1a; https://github.com.cnpmjs.org # 服务器位于香港https://gitclone.com # 服务器位于杭州https://doc.fastgit.org # 服务器位于香港 例如&#xff1a;将 git clone https:…

nginx+keepalived负载均衡及高可用

1 项目背景 keepalived除了能够管理LVS软件外&#xff0c;还可以作为其他服务的高可用解决方案软件。采用nginxkeepalived&#xff0c;它是一个高性能的服务器高可用或者热备解决方案&#xff0c;Keepalived主要来防止服务器单点故障的发生问题&#xff0c;可以通过其与Nginx的…

厦门大学第二讲:DeepSeek大模型赋能高校教学和科研(124页)(文末附下载方法)

厦门大学大数据教学团队林子雨副教授发布&#xff1a; 厦大团队&#xff5c;报告&#xff1a;《读懂大模型概念、技术与应用实践》https://blog.csdn.net/2401_83947004/article/details/145995693?sharetypeblogdetail&sharerId145995693&sharereferPC&sharesou…

解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported

找了好多教程都没有用&#xff0c;终于解决了&#xff01;&#xff01;我是因为ubuntu分区的时候出问题了 问题描述&#xff1a; 双系统装好&#xff0c;隔天开机找不到引导项&#xff0c;黑屏显示下列 因为我用的D盘划分出来的部分空闲空间&#xff0c;而不是全部&#xff0c…

基于Windows11的RAGFlow安装方法简介

基于Windows11的RAGFlow安装方法简介 一、下载安装Docker docker 下载地址 https://www.docker.com/ Download Docker Desktop 选择Download for Winodws AMD64下载Docker Desktop Installer.exe 双点击 Docker Desktop Installer.exe 进行安装 测试Docker安装是否成功&#…

基于Android平台的SOME/IP测试模块 EPT-ETS

在汽车产业智能化、网联化的时代浪潮中&#xff0c;汽车电子系统正经历着前所未有的变革。SOME/IP&#xff08;Scalable service-Oriented MiddlewarE over IP&#xff09;协议作为汽车电子通信领域的关键技术&#xff0c;其稳定性、可靠性与高效性对于整车性能的提升起着至关重…

初阶数据结构习题【7】(3顺序表和链表)—— 21. 合并两个有序链表

1. 题目描述 力扣在线OJ——21合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1…

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中&#xff0c;全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构&#xff0c;企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例&#xff0c;其利用中台系统将分散在CRM、ERP及内部文档…

大模型学习--微调

模型微调是一种在已有预训练模型的基础上&#xff0c;通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时&#xff0c;适应特定任务的细微差别。使用微调模型&#xff0c;可以获得以下好处&#xff1a; 提高性能&a…

【C++】模板编程入门指南:零基础掌握泛型编程核心(初阶)

文章目录 一、泛型编程二、函数模板1. 函数模板的概念和格式2. 函数模板的原理3. 函数模板的实例化隐式实例化显式实例化 三、类模板 一、泛型编程 泛型编程就是编写与类型无关的通用代码&#xff0c;是代码复用的一种手段&#xff0c;模板是泛型编程的基础&#xff0c;可能不太…

IO学习day2

一、思维导图 IO标准函数 问&#xff1a; printf\fprintf\sprintf\snprintf之间的区别&#xff1f; 1. printf&#xff1a;格式串输出&#xff0c;会在当前终端打印输出结果 2. fprintf&#xff1a;文件的写入&#xff0c;可以写入不同的数据类型&#xff08;int&#xff0c…