点击“阅读原文”直接打开【北京站 | GPU CUDA 进阶课程】报名链接

预留一半内存给Lucence使用

一个常见的问题是配置堆太大。你有一个64 GB的机器,觉得JVM内存越大越好,想给Elasticsearch所有64 GB的内存。

当然,内存对于Elasticsearch来说绝对是重要的,用于更多的内存数据提供更快的操作。而且还有一个内存消耗大户-Lucene
Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。

Lucene的性能取决于和OS的交互,如果你把所有的内存都分配给Elasticsearch,不留一点给Lucene,那你的全文检索性能会很差的。

最后标准的建议是把50%的内存给elasticsearch,剩下的50%也不会没有用处的,Lucene会很快吞噬剩下的这部分内存。

32GB限制

给ES的内存配置不是越大越好,建议不能超过32GB,不同jdk版本最大边界值是不同的,对于32位小于32G JVM才采用内存对象指针压缩技术,不然对象指针需要占用很大的内存。

使用如下命令测试最大边界值:

java -Xmx32767m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops    
bool UseCompressedOops       = false         {lp64_product}    
java -Xmx32766m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops    
 bool UseCompressedOops       = true          {lp64_product}  
$ JAVA_HOME=`/usr/libexec/java_home -v 1.8` java -Xmx32766m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops    
bool UseCompressedOops   := true
 $ JAVA_HOME=`/usr/libexec/java_home -v 1.8` java -Xmx32767m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops

bool UseCompressedOops   = false

在ES启动日志中最好能够看到压缩对象指针为真。

heap size [15.8gb], compressed ordinary object pointers [true]
在java中,所有的对象都分配在堆上,然后有一个指针引用它。指向这些对象的指针大小通常是CPU的字长的大小,不是32bit就是64bit,这取决于你的处理器,指针指向了你的值的精确位置。

对于32位系统,你的内存最大可使用4G。对于64系统可以使用更大的内存。但是64位的指针意味着更大的浪费,因为你的指针本身大了。浪费内存不算,更糟糕的是,更大的指针在主内存和缓存器(例如LLC, L1等)之间移动数据的时候,会占用更多的带宽。

java 使用一个叫内存指针压缩的技术来解决这个问题。它的指针不再表示对象在内存中的精确位置,而是表示偏移量。这意味着32位的指针可以引用40亿个对象,而不是40亿个字节。最终,也就是说堆内存长到32G的物理内存,也可以用32bit的指针表示。

一旦你越过那个神奇的30-32G的边界,指针就会切回普通对象的指针,每个对象的指针都变长了,就会使用更多的CPU内存带宽,也就是说你实际上失去了更多的内存。事实上当内存到达40-50GB的时候,有效内存才相当于使用内存对象指针压缩技术时候的32G内存。

这段描述的意思就是说:即便你有足够的内存,也尽量不要超过32G,因为它浪费了内存,降低了CPU的性能,还要让GC应对大内存。

机器内存大于64GB

你可以考虑一台机器上创建两个或者更多ES节点,而不要部署一个使用32+GB内存的节点。仍然要 坚持50%原则,假设 你有个机器有128G内存,你可以创建两个node,使用32G内存。也就是说64G内存给ES的堆内存,剩下的64G给Lucene。

如果你选择第二种,你需要配置cluster.routing.allocation.same_shard.host:true。这会防止同一个shard的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了)

swapping是性能的坟墓

这是显而易见的,但是还是有必要说的更清楚一点,内存交换到磁盘对服务器性能来说是致命的。想想看一个内存的操作必须是快速的。

如果内存交换到磁盘上,一个100微秒的操作可能变成10毫秒,再想想那么多10微秒的操作时延累加起来。不难看出swapping对于性能是多么可怕。

最好的办法就是在你的操作系统中完全禁用swapping。这样可以暂时禁用:

sudo swapoff -a

为了永久禁用它,你可能需要修改/etc/fstab文件,这要参考你的操作系统相关文档。

如果完全禁用swap,对你来说是不可行的。你可以降低swappiness 的值,这个值决定操作系统交换内存的频率。这可以预防正常情况下发生交换。但仍允许os在紧急情况下发生交换。对于大部分Linux操作系统,可以在sysctl 中这样配置:

vm.swappiness = 1

备注:swappiness设置为1比设置为0要好,因为在一些内核版本,swappness=0会引发OOM(内存溢出)

最后,如果上面的方法都不能做到,你需要打开配置文件中的mlockall开关,它的作用就是运行JVM锁住内存,禁止OS交换出去。在elasticsearch.yml配置如下:

bootstrap.mlockall: true

未完待续

原文链接:http://www.jianshu.com/p/a2b682e5c1ab

   BY  简书

往期精彩回顾

深度学习视频(一) | 免费放送—深度学习的应用场景和数学基础

深度学习视频(二) | 免费放送—卷积神经网络(一)

深度学习视频(三) | 免费放送—卷积神经网络(二)

深度学习视频(四) | 免费放送—深度学习的具体模型和方法

深度学习视频(五) | 免费放送—上机实操(一)

点击“阅读原文”直接打开【北京站 | GPU CUDA 进阶课程】报名链接

ElasticSearch优化系列二:机器设置(内存)相关推荐

  1. ElasticSearch优化系列三:机器设置(内存)

    heap参数设置优化 命令行修改 ./bin/elasticsearch -Xmx10g -Xms10g xmx-JVM最大允许分配的堆内存,按需分配 xms-JVM初始分配的堆内存 此值设置与-Xm ...

  2. SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度...

      2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...

  3. MySQL优化系列14-优化MySQL内存

    备注:测试数据库版本为MySQL 8.0 文章目录 一. MySQL如何使用内存 二.监控MySQL内存使用 三.开始large page支持 参考: 一. MySQL如何使用内存 MySQL分配缓冲 ...

  4. 性能优化系列(三)内存性能优化

    文章首发「Android波斯湾」公众号,更新地址:https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode Android 为每个应 ...

  5. SSE图像算法优化系列二十五:二值图像的Euclidean distance map(EDM)特征图计算及其优化。...

    Euclidean distance map(EDM)这个概念可能听过的人也很少,其主要是用在二值图像中,作为一个很有效的中间处理手段存在.一般的处理都是将灰度图处理成二值图或者一个二值图处理成另外一 ...

  6. ElasticSearch优化系列三:索引过程

    大家可能会遇到索引数据比较慢的过程.其实明白索引的原理就可以有针对性的进行优化.ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡. ...

  7. ElasticSearch优化系列一:集群节点规划

    节点职责单一,各司其职 elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: ...

  8. SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)...

    拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明.在这方面确实融合的比较好.但是本文我们主要讲 ...

  9. JVM系列二:GC策略内存申请、对象衰老

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

最新文章

  1. 计算机图形学——BRDF
  2. nginx http转https_Nginx处理访问www域名跳转到不带www域名的配置方法
  3. python的科学计算库有哪些_Python科学计算库-Numpy
  4. 《软件工程》总结——第十一章
  5. Oracle起步——Oracle 11g安装配置
  6. matlab生成随机粗糙表面_随机粗糙面建模
  7. vue自定义插件-弹框
  8. android 上传头像工具类,Android开发中如何实现头像的更换与上传
  9. Linux操作系统原理与应用08:文件系统
  10. [2019BUAA软工]第0次代码作业
  11. 书籍-Docker 容器与容器云
  12. ppt中插入html格式图表
  13. 【英语-同义词汇词组】consider,think,believe,count,deem,reckon,regard、hold 表示【认为】时的用法及区别
  14. ODATA 后台报错,添加message
  15. java_secret_dire宝典
  16. 数字图像处理(1)-图片信息获取和RGB-HSI
  17. iba测评题目_2017单独招生考试综合试题(卷)与答案解析.doc
  18. 128.OpenLDA安装并配置客户端-1
  19. 服务器存储系统巡检,服务器存储网络设备巡检报告-20210628025243.pdf-原创力文档...
  20. 越是冬天,越要埋头潜行

热门文章

  1. 西门子plm_西门子PLM副总裁:NX,智能的CAD平台
  2. android gridview行分割线,Android中控件GridView实现设置行列分割线的方法示例
  3. python实现单链表快速排序升序linkedqueue_LeetCode 总结 - 搞定 Linked List 面试题
  4. 计算机组成原理r型指令logisim实现_大学本科计算机科学与技术专业知识体系
  5. 公平锁非公平锁的实际使用_理解ReentrantLock的公平锁和非公平锁
  6. yarn 更新_【HDFS篇13】HA高可用 --- YARN-HA集群配置
  7. python 全中文匹配字符_Python教程:进程和线程amp;正则表达式
  8. java 强制走catch_java – IDE强制使用try / catch包围但不抛出异常
  9. php 监控文件夹变化,swoole 开发中监听目录文件变化, 自动重启项目
  10. 20180826(04)-Java序列化