首先,说明笔者的机器环境(不结合环境谈解决方案都是耍流氓): cpu 32核,内存128G,非固态硬盘:RAID0 (4T * 6),单节点,数据量在700G到1800G,索引15亿~21亿。敖丙大人,在蘑菇街,可多集群分片,固态硬盘,比不起啊。

业务场景

保存7天索引,每天有400G~500G。发现ES时不时的OOM(out of memory)和重启。当索引超过500G的时候,ES重启到加载所有分片,时间约30分钟到1小时。

题外话,ES OOM 会生成 .hprof 文件,如下图:

用jhat来分析OOM堆转储文件,具体命令:

 jhat -port 7401 -J-Xmx4G java_pid19546.hprof

解决办法

1、改文件存储类型,减少内存占用

设置存储类型为:“hybridfs” ,即:“index.store.type”: “hybridfs” (原来为“mmapfs”,详见附2;另外,ES 5.6应为“fs”,不支持“hybridfs”,最新的7.4版本支持“hybridfs”)。

  • mmapfs:index映射到内存;
  • niofs :并发多线程以NIO的方式读取index文件;
  • hybridfs:混合 mmafs和niofs ,根据读取模式选择最佳的文件系统。

效果:在600G左右的索引,5天索引,确实没有了OOM。但一旦增大到7个索引,就不行了。用jstat命令,即:

jstat -gcutil 6811 (ES的PID)

查看ES的jvm,如下图:

O: Old space utilization as a percentage of the space’s current capacity (老年代空间占用率)。O最高达到79,就往下降,原来为存储类型为“mmapfs”,O很容易就飙到100。

2、不要自己创建文档ID

ES默认会自动创建文档Id"(如:_id": “AW8922mK8RqpiZJD9zb2”),如果自己生成Id,则每次存储新的文档的时候,ES都会查看整个分片是否已经存在该Id。如果分片存储有上千万的文档,这是一个比较耗时的操作。

3、关闭暂时不用的索引,减少打开索引的数量

关闭索引(文件仍然存在于磁盘,只是释放掉内存,需要的时候可重新打开)。设置打开索引参数:"__es.maxPermanentlyOpenIndices":4 (最大打开索引:7改为4)。

4、扩大堆内存

设置堆大小,从15G提高到30G,即: -Xms30g -Xmx30g (注意:最大不要超过物理内存的 %50)。

5、扩大虚拟内存空间

命令:

sysctl -w vm.max_map_count=2621440(默认值是 “262144”)
扩大这个,可以防止这个数量太低而导致的OOM(详见附6)

6、forcemerge

设置merge时最大的线程数:index.merge.scheduler.max_thread_count。固态硬盘——默认最大值 Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)) ,普通旋转磁盘——设置为1。

笔者机器上,单merge 线程,300G的索引耗时:7个小时

优化效果:term 单条件查询,查询时间从10秒多提高到3秒多,索引减少约%2.85,减少4000多万,具体如下表:

可通过命令查看各个分片的情况,如下(可查看总的segments数量):

curl -s "http://localhost:9200/_cat/segments/pcap_flow-2019-12-10?v&h=shard,segment,size,size.memory" | awk '{sum += $NF} END {print sum}'

force merge的restful API:

curl -X POST "localhost:9200/pcap_flow-2019-12-11/_forcemerge?max_num_segments=2"

说明:

1)max_num_segments, 设置最大segement数量,数量越小,查询速度提高越明显,但merge耗时越长;

2)全部merge,不加索引ID,则如下:

curl -X POST “localhost:9200/_forcemerge”
3)merge过程是串行的,如果同时merge多个,后面的会被阻塞,直到第一个merge完成为止。另外,对于不再有写入的更新的index,才建议force merge,不然反而会让搜索的性能更差;

4)restful api 查看_segments,如下:

curl -X GET “localhost:9200/_cat/segments?v&pretty”
效果如下图:

题外话,如果贵司银子多,可以集群分片,搞SSD,否则只有结构优化,这一招。

参考连接 :

遇到Elasticsearch OOM(内存溢出),除了瞪白眼,还能干啥…
https://www.jianshu.com/p/8b96865efd0e

Elasticsearch OOM(内存溢出)相关推荐

  1. 面试两连击:线上JVM GC问题和OOM内存溢出的解决方案,聊聊呗!

    点击上方石杉的架构笔记,右上角选择"设为星标" 每日早8点半,技术文章准时送上 公众号后台回复"学习",获取作者独家秘制精品资料 往期文章 BAT 面试官是如何 ...

  2. 转:记一次linux oom内存溢出排查过程

    @转:记一次linux oom内存溢出排查过程 记一次linux oom内存溢出排查过程 2018年08月16日 14:13:49 enchanterblue 阅读数 4099更多 分类专栏: --- ...

  3. springboot+poi导出百万级数据避免OOM内存溢出

    springboot+poi导出百万级数据避免OOM内存溢出 文章目录 springboot+poi导出百万级数据避免OOM内存溢出 前言 一.具体实现 二.代码实现 1.引入poi包 2.功能代码 ...

  4. java写入excel文件内存不足,java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架...

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  5. 记一次服务器宕机原因排查(oom内存溢出)

    一.背景 国庆期间,公司上线了一个投票活动,八号回来中午投票结束.一切风平浪静,就在投票快结束前十几分钟页面突然进不去了. 二.猜测 按照我的猜测,推测有以下几种可能性: 1.页面BUG,导致活动出错 ...

  6. OOM(内存溢出)造成原因及解决方案

    一.概念 内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存. 二.造成原因 2.1.内存泄漏 由于长 ...

  7. OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存溢出

    Java堆内存溢出 只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常,代码如下: import ...

  8. jvm性能调优实战 -59数据同步系统频繁OOM内存溢出故障排查

    文章目录 背景 从现象看到本质 通过jstat来确认我们的推断 通过MAT找到占用内存最大的对象 背景 首先说一下案例背景,线上有一个数据同步系统,是专门负责从另外一个系统去同步数据的,简单来说,另外 ...

  9. java oom dump_Java OOM 内存溢出分析

    编写OOM程序 package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import ...

  10. 记一次linux oom内存溢出排查过程

    一,背景 收到应用服务报警,然后登录上服务器查看原因,发现进程不再了. 二,问题分析 1,那么判断进程被干掉的原因如下: (1),机器重启了 通过uptime看机器并未重启 (2),程序有bug自动退 ...

最新文章

  1. Git学习系列之Git的功能特性(从一般开发者的角度和主开发者的角度来剖析)...
  2. 阿里云文件上传工具类
  3. LeetCode Algorithm 389. 找不同
  4. Word2010-页眉中字数未满但自动换行
  5. ZAB(Zookeeper Atomic Broadcast)协议详解
  6. 基于JAVA+SpringBoot+Mybatis+MYSQL的图书借阅管理系统
  7. 关于windows的进程处理(三)
  8. 计算机音乐组获奖作品,大学生计算机音乐创作类决赛揭晓 浙音6件作品均获奖...
  9. 全新Java高级工程师学习路线图(附学习资料)
  10. 解决 uniapp 打包次数限制
  11. Windows系统怎么查看电脑的系统位数?
  12. python爬取新浪微博大V的所有微博内容
  13. 详解Python中列表切片及浅拷贝的关系(上)
  14. linux 中的.so和.a文件
  15. HDLBits学习笔记——状态机(中)
  16. 相关性分析热点图_车联网数据分析(二):驾驶行为分析
  17. Robocode介绍
  18. springboot2.0日志配置 logback的使用和logback.xml详解
  19. 计算机科学上课带电脑,985 高校计算机系学生都在用的笔记本,我被深深地种草了!...
  20. 永磁同步电机三相等效电路图_永磁同步电动机的原理与结构详解

热门文章

  1. php 获取 年月日时分秒_JS获取年月日时分秒的方法分析
  2. php7从基础到商业实战,TP5从基础到项目实战全套
  3. python画图小实例_python绘图实例
  4. 130712周赛(CF)
  5. 用Html5制作的一款数学教学程序Function Graphics(绘制函数图的程序)
  6. 以太坊源码分析:共识(1)矿工
  7. Django框架第一篇基础
  8. [翻译]关于Swift的编译时间优化
  9. react-native ES5与ES6写法对照表
  10. SQL Profile (总结4)--使用演示示例