《Elasticsearch从开始到优化:重要配置》

Elasticsearch启动时会检查一些很重要的设置是否配置,如果没配置,可能会出现无法预料的问题。

File Descriptors

文件描述符设置。使用Elasticsearch 的zip或tar.gz安装包时,永久修改修改max file descriptors:

sudo vim /etc/security/limits.conf

1
2
* soft nofile 655360
* hard nofile 655360

新打开的session里生效。

Number of threads

用户进程数设置。使用Elasticsearch 的zip或tar.gz安装包时,永久修改修改max user processes:

sudo vim /etc/security/limits.conf

1
2
* soft nproc 50960
* hard nproc 50960

有的系统需要:

sudo vim /etc/security/limits.d/20-nproc.conf

1
* soft nproc 50960

新打开的session里生效。

Virtual memory

虚拟内存设置。Elasticsearch默认使用mmapfs、sniofs 两种方式存储索引。也可以修改配置index.store.type确定使用任意一种。操作系统默认的最大mmap数比较低,可能会导致内存异常。永久修改修改max_map_count:

sudo vim /etc/sysctl.conf

1
vm.max_map_count=2621440

然后执行命令:

sudo sysctl -p

heap size设置

设置heap size最小值(Xms),heap size最大值(Xmx), 通过修改配置文件,vim elasticsearch-5.1.2/config/jvm.options

1
2
-Xms2g
-Xmx2g

堆设置很好的经验法则:

  • 最小heap size(Xms) 和 最大heap size(Xmx)相等
  • 最大heap size(Xmx)设置为50%物理内存,剩下50%作为文件系统缓存。
  • 不超过32GB。堆大小在某个cutoff(将近32GB)范围内时,JVM使用compressed oops技术来优化内存、带宽、缓存使用。所以最大heap size(Xmx)不要超过这个cutoff。Elasticsearch的log中如果有下面类似的log,表明Xms没超过这个cutoff。
1
heap size [1.9gb], compressed ordinary object pointers [true]
  • 更好的设置是,heap size不要超过JVM使用zero-based compressed oops技术时的cutoff。不同的系统,cutoff不相同。大部分系统,26GB的最大heap size(Xmx)是安全的,有些系统30G也可以。带上 -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode这两个JVM options启动Elasticsearch时,下面的log则表明启用了zero-based compressed oops技术:
1
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops

下面的则表明未启用:

1
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000

Java中的对象分配在堆中,由指针引用。这些指向java对象的指针叫做Ordinary object pointers(oop),他们的大小实际就是CPU的本地字长,32bit或64bit,这 32 bits 或 64 bits 的指针的值,是堆中确定的byte位置。

所以32-bit的系统中,oop最多只能指向2^32 byte, 即heap size最大只能4GB,而64-bit系统,heap size大的多。64位的指针本身更大,占用空间更多,同一个应用在64-bit系统使用的堆空间大概是32-bit系统的1.5倍。除了更消耗内存,更糟糕的是,更长的指针在主存和各种缓存(LLC, L1等等)间移动时,消耗更多的带宽。

32 bits 的短指针来引用的内存空间不够,64 bits的长指针会带来性能损耗,怎么办呢?JVM使用了Compressed Ordinary Object Pointers(compressed oops)的技术。这种 32 bits 指针指向的不再是堆中byte 位置,而是对象偏移量。这意味着 32 bits 的指针可以指向2^32个对象,大约32GB大小。一旦超过32G,compressed oops会变成oop,所以heap size不要超过32G。

Disable swapping设置

swapping(内存交换)会导致JVM heap被交换到磁盘上,导致很差的性能和Elasticsearch节点的不稳定。应该不惜一切代价禁止swapping。禁止swapping的一种方法就是锁住JVM内存

锁内存

修改配置文件,vim elasticsearch-5.1.2/config/elasticsearch.yml

1
bootstrap.memory_lock: true

赋予运行Elasticsearch的用户(本文用户是hadoop)锁内存权限:

sudo vim /etc/security/limits.conf

1
2
3
# allow user 'hadoop' mlockall
hadoop soft memlock unlimited
hadoop hard memlock unlimited

.
.
.

改变自己,改变世界,支持我吧!