内存分配
机器内存小于64GB
当机器内存小于 64G 时,遵循通用的原则,50% 给 ES,50% 留给 lucene。
因为ES不止需要内存存储,他也同样需要空余的内存来提供更加快速的查询性能,这一切都源于底层的lucene,它能够很好的利用我们操作系统的内存,其中50%就是最佳的配比。
机器内存等于64GB
最佳的配比,遵循 1 : 1 的内存进行配置。
也就是说ES配置32G,闲置空间32G (用作lucene查询).
机器内存大于64GB
如果整台机器上只部署ES,那也是非常不恰当的,
因为在Java中,所有对象都分配在堆上并由指针引用。普通的对象指针(OOP)指向这些对象,传统上它们是CPU本地字的大小:32位或64位,取决于处理器。
对于32位系统,这意味着最大堆大小为4 GB。对于64位系统,堆大小可能会变得更大,但是64位指针的开销意味着仅仅因为指针较大而存在更多的浪费空间。并且比浪费的空间更糟糕,当在主存储器和各种缓存(LLC,L1等等)之间移动值时,较大的指针消耗更多的带宽。
Java使用称为压缩oops的技巧来解决这个问题。而不是指向内存中的确切字节位置,指针引用对象偏移量。这意味着一个32位指针可以引用40亿个对象,而不是40亿个字节。最终,这意味着堆可以增长到约32 GB的物理尺寸,同时仍然使用32位指针。
一旦你穿越了这个神奇的〜32 GB的边界,指针就会切换回普通的对象指针。每个指针的大小增加,使用更多的CPU内存带宽,并且实际上会丢失内存。实际上,在使用压缩oops获得32 GB以下堆的相同有效内存之前,需要大约40-50 GB的分配堆。
以上小结为:即使你有足够的内存空间,尽量避免跨越32GB的堆边界。