Elastic Search 环境配置

· 禁用交换区
· 增加文件描述符的数量
· 确保足够的虚拟内存
· 确保有足够的线程数上限
· JVM DNS缓存设置
· 临时目录不要挂载在noexec下

调整Linux系统的相关参数设置

① 修改最大文件数和锁内存限制,打开文件/etc/security/limits.conf,增加或修改如下选项(elastic代表启动Elasticsearch集群的用户):

elastic -  hard   nproc     unlimited
Elastic -  soft   nproc     unlimited
elastic -  nofile 262144
elastic -  memlock          unlimited
elastic -  fsize            unlimited
elastic -  as               unlimited

② 更改一个进程能拥有的最大内存区域限制,编辑(swappiness禁用交换区)/etc/sysctl.conf文件,新增或修改如下内容,保存后,执行sysctl-p。

vm.max_map_count=262144
vm.swappiness=1

创建用户

useradd elastic

Heap 设置

默认情况下,Elasticsearch告诉JVM使用最小和最大大小为1GB的堆。当转移到生产环境时,需要配置堆大小以确保Elasticsearch具有足够的堆可用,这是很重要的。
Elasticsearch将通过Xms(最小堆大小)和Xmx(最大堆大小)设置分配jvm.options中指定的整个堆栈。
这些设置的值取决于服务器上可用的内存大小。良好的经验法则是:

· 将最小堆大小(Xms)和最大堆大小(Xmx)设置为相等的值。
· Elasticsearch可用的堆越大,可以用于缓存的内存就越大。但请注意,堆太大会触发长时间的垃圾回收以致服务集暂停。
· 将Xmx设置为不超过物理RAM的50%,以确保有足够的物理内存用于内核文件系统缓存。
· 不要将Xmx设置为高于Jvm用于压缩对象指针(compressed oops)的截止值。确切的截止值有所不同,但接近32GB。可以通过在日志中查找以下行来验证Xmx值是否在限制范围内:

临时文件存储目录

默认情况下,Elasticsearch使用启动脚本直接在系统临时目录下创建专用临时目录。在一些Linux发行版上,如果文件和目录最近没有被访问,系统实用程序将从/tmp中清除它们。如果长时间不使用需要临时目录的功能,这可能导致在运行Elasticsearch时删除私有临时目录。如果随后使用了需要临时目录的功能,则会导致问题。
如果使用.deb或.rpm包安装Elasticsearch,并在systemd下运行它,那么Elasticsearch使用的私有临时目录将从定期清理中排除。
但是,如果打算在Linux上运行.tar.gz发行版很长一段时间,应该考虑为Elasticsearch创建一个专用的临时目录,该目录不应在将清除旧文件和目录的路径下。此目录应设置权限,以便只有运行Elasticsearch的用户可以访问它。在启动Elasticsearch之前,应设置$ES_TMPDIR环境变量指向它。

禁用交换区

大多数操作系统尝试尽可能多地将内存用于文件系统缓存,因此应用程序的数据可能会被移到swap区,这可能导致部分JVM堆,甚至其可执行页面被交换到磁盘。
上述交换对性能、节点稳定性都非常不利,它可能会导致垃圾收集持续几分钟而不是几毫秒,并可能导致节点响应缓慢,甚至断开与集群的连接。因此,应不惜一切代价予以避免。在弹性分布式系统中,让操作系统杀死节点比启用交换区更有效。
禁用交换有三种方法。首选选项是完全禁用交换。如果不想这么做,那么还有最小化交换与内存锁定两种方法,采用哪种方法取决于用户的环境。

1.完全禁用交换区
通常,Elasticsearch是在服务器上运行的唯一服务,它的内存使用由JVM选项控制,不需要启用交换。
在Linux系统上,可以通过运行以下命令临时禁用交换:

sudo swapoff-a

这不需要重新启动Elasticsearch,要永久禁用它,需要编辑/etc/fstab文件并注释掉包含单词swap的任何行。

2.配置swappiness参数
Linux系统上可用的另一个方式是确保sysctl值vm.swappiness设置为1。这降低了内核交换的可能性,在正常情况下不会导致交换,同时仍然允许整个系统在紧急情况下交换。
打开/etc/sysctl.conf文件,增加或编辑以下内容:

vm.swappiness=1
sysctl -p

3.内存锁定

另一种选择是在Linux/Unix系统上使用mlockall,或者在Windows上使用virtuallock,尝试将进程地址空间锁定到RAM中,防止任何Elasticsearch内存被交换出去。这可以通过将如下行添加到config/elasticsearch.yml文件来完成:

bootstrap.memory_lock:true

如果试图分配的内存超过可用内存,mlockall可能会导致JVM或shell会话退出。
启动Elasticsearch后,通过检查此请求的输出中的mlockall值,可以查看是否成功应用了如下设置:

GET_nodes?filter_path=**.mlockall

如果看到mlockall为false,则表示mlockall未启用,具体信息到日志中查看。
在Linux/Unix系统上,最常见的情形是运行Elasticsearch的用户没有锁定内存的权限。可操作如下:在启动Elasticsearch之前,以root权限运行ulimit-l unlimited,或者在/etc/security/limits.conf中将memlock设置为unlimited。

文件描述符

Elasticsearch需要使用许多文件描述符或文件句柄。文件描述符用完可能是灾难性的,很可能会导致数据丢失。确保将运行Elasticsearch的用户的打开文件描述符的数量限制增加到65536或更高。
可以使用API查看为每个节点配置的最大文件描述符数量,方法如下:

GET_nodes/stats/process?filter_path=**.max_file_descriptors

虚拟内存

Elasticsearch默认使用mmapfs目录存储其索引。mmap计数的操作系统默认限制可能太低,这可能导致内存不足异常。
在Linux上,可以通过以root用户身份运行以下命令来增加限制:

sysctl-w vm.max_map_count=262144

要永久设置此值,请更新/etc/sysctl.conf中的vm.max_map_count设置。增加或编辑:

vm.max_map_count=262144

执行命令:

sysctl vm.max_map_count

2.6.5 线程数量限制

Elasticsearch为不同类型的操作使用许多线程池,重要的是,它能够在需要时创建新的线程。确保Elasticsearch用户可以创建的线程数至少为4096。
这可以通过在启动Elasticsearch之前以root用户执行ulimit-u 4096来设置,或者通过在/etc/security/limits.conf中将nproc设置为4096来完成,增加或编辑:

elastic hard nproc unlimited
elastic soft nproc u