ES为什么内存最好小于32G

ES是用java开发的
java32位虚拟机的寻址最大4G,64位理论上来说无限大,请参考java Object的header结构。
但是实际上64位的地址指针会导致一下问题:

  1. 增加了GC开销:64位对象引用需要占用更多的堆空间,留给其他数据的空间将会减少, 从而加快了GC的发生,更频繁的进行GC。
  2. 降低CPU缓存命中率:64位对象引用增大了,CPU能缓存的oop将会更少,从而降低了CPU缓存的效率。
    指针压缩技术可以解决这个问题,请参考
    JAVA指针压缩的实现原理
    指针压缩技术支持的理论最大内存为32G,但是最好小于这个值.
    超过这个值会导致指针压缩技术失效,会导致指针变成普通指针(64位),速度变慢了。
    ES限制这个小于32G就是这个原因,超过就效率变差了。

如果你的电脑内存大,可以开多个数据节点,但是这会导致另外一个问题,操作系统文件句柄个数是有限的,多个ES会争抢系统资源,总之一句话,还是要根据实际情况来选择你的配置。

ES内存为什么要占系统内容的50%

ES是用java开发的,底层是Lucene
ES内存中的内容会在lucene中也缓存一份,如果ES占的太大,lucene就需要把数据存到硬盘上
可以想象,当前情况下,硬盘io是速度最大的瓶颈。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐