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