理想情况下,Elasticsearch应该在服务器上单独运行,并使用可用的所有资源。为此,您需要配置操作系统,以允许运行Elasticsearch的用户访问比默认允许的资源更多的资源。
在进行生产模式
之前必须解决以下设置:
- Set JVM heap size
- Disable swapping
- Increase file descriptors
- Ensure sufficient virtual memory
- Ensure sufficient threads
开发模式与生产模式 默认情况下,Elasticsearch假定您正在开发模式。如果上述任何设置未正确配置,将向日志文件中写入警告,但您可以启动并运行Elasticsearch节点。
一旦配置了网络设置,如network.host,Elasticsearch假定您正在转向生产,并将上述警告升级到异常。这些异常将阻止Elasticsearch节点启动。这是一个重要的安全措施,以确保您不会因配置不正确的服务器而丢失数据。
配置系统设置(Configuring system settings)
配置系统设置的位置取决于您用于安装Elasticsearch的软件包以及您正在使用的操作系统。
使用.zip或.tar.gz软件包时,可以配置系统设置:
- 暂时修改ulimit或
- 永久修改/etc/security/limits.conf中。
当使用RPM或Debian软件包时,大多数系统设置都在 system configuration file中设置。但是,使用systemd的系统要求在systemd configuration file.指定systemlimits。
ulimit
在Linux系统上,可以使用ulimit临时更改资源限制。在切换到将运行Elasticsearch的用户之前,通常需要切换到root用户进行设置,设置方法为ulimit -n 65536 像下面这样:
# 切换到root
sudo su
# 设置ulimit
ulimit -n 65536
# 切换回elasticsearch用户
su elasticsearch
设置的limit仅在当前会话期间有效。
/etc/security/limits.conf
在Linux系统上,可以通过编辑/etc/security/limits.conf文件为特定用户永久设置limit。要将Elasticsearch用户的最大打开文件数设置为65,536,请将以下行添加到limits.conf文件中:
elasticsearch - nofile 65536
此更改仅在下次Elasticsearch用户打开新会话时生效。
注意:Ubuntu and
limits.conf
Ubuntu忽略由init.d启动的进程的limits.conf文件。要启用limits.conf文件,请编辑/etc/pam.d/su并取消注释以下行: session required pam_limits.so
Sysconfig文件
使用RPM或Debian软件包时,可以在系统配置文件中指定系统设置和环境变量,系统配置文件位于:
RPM | /etc/sysconfig/elasticsearch |
---|---|
Debian | /etc/default/elasticsearch |
但是,对于使用systemd的系统,需要通过systemd指定system limits。
Systemd配置
在使用systemd的系统上使用RPM或Debian软件包时,必须通过systemd指定system limits。
systemd服务文件(/usr/lib/systemd/system/elasticsearch.service)包含默认应用的limits。
要覆盖这些,请添加一个名为/etc/systemd/system/elasticsearch.service.d/elasticsearch.conf的文件,并指定该文件中的任何更改,例如:
[Service]
LimitMEMLOCK=infinity
设置JVM选项
通过jvm.options配置文件是设置Java Virtual Machine options(包括系统属性和JVM标志)的首选方法。该文件的默认位置是config / jvm.options(从tar或zip分发版安装)和/etc/elasticsearch/jvm.options(从Debian或RPM软件包安装时)。该文件包含以行分隔的JVM参数列表,必须以 - 开头。您可以向此文件添加自定义JVM标志,并将此配置检查到版本控制系统中。
设置Java虚拟机选项的另一种机制是通过ES_JAVA_OPTS环境变量。例如:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch
使用RPM或Debian软件包时,可以在系统配置文件中指定ES_JAVA_OPTS。
通过jvm.options设置JVM堆大小
默认情况下,Elasticsearch告诉JVM使用堆(Heap)最小和最大大小为2 GB。迁移到生产时,重要的是配置堆(Heap)大小以确保Elasticsearch有足够的堆可用。
Elasticsearch将通过Xms(最小堆大小)和Xmx(最大堆大小)设置来分配jvm.options中指定的整个堆。
这些设置的值取决于服务器上可用的RAM数量。良好的经验法则是:
-
将最小堆大小(Xms)和最大堆大小(Xmx)设置为相等。
-
Elasticsearch可用的堆(Heap)数越多,可用于缓存的内存越多。但请注意,太多的堆可能会使您长时间收集垃圾回收。
-
将Xmx设置为不超过物理RAM的50%,以确保内核文件系统缓存有足够的物理RAM。
-
不要将Xmx设置为高于JVM用于压缩对象指针的截止值(压缩的oops);精确截止值不等,但接近32 GB。您可以通过在日志中查找行来验证您是否处于极限状态,如下所示:
heap size [1.9gb], compressed ordinary object pointers [true]
-
更好的是,尝试保持低于zero-based compressed oops的阈值;在大多数系统上,确切的截止值不同,但26 GB是安全的,但在某些系统上可以高达30 GB。您可以使用JVM选项-XX:+ UnlockDiagnosticVMOptions -XX:+ PrintCompressedOopsMode启动Elasticsearch,并查找如下所示的行来验证您是否处于极限状态:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
表明启用了zero-based compressed oops,而不是
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
以下是通过jvm.options文件设置堆大小的示例:
-Xms2g
-Xmx2g
也可以通过环境变量设置堆大小。这可以通过注释掉jvm.options文件中的Xms和Xmx设置,并通过ES_JAVA_OPTS设置这些值:
ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch
Disable swapping
大多数操作系统尽可能使用尽可能多的内存,以及文件系统缓存,并切换掉未使用的应用程序内存。这可能导致部分JVM堆或甚至其可执行页面被交换(swap)到磁盘。
交换(swap)对于性能非常不利,对于节点的稳定性,应该不惜一切代价避免。它可能导致垃圾收集持续数分钟而不是毫秒,并可能导致节点缓慢响应或甚至断开与集群的连接。在弹性分布式系统中,让操作系统杀死节点更为有效。
有三种禁用交换(swap)的方法。首选方法是完全禁用交换(swap)。如果这不是一个选择,是否愿意减少swappiness与内存锁定是取决于你的环境。
Disable all swap files
通常,Elasticsearch是在盒子上运行的唯一服务,其内存使用由JVM选项控制。应该不需要启用交换(swap)。
在Linux系统上,您可以通过运行以下方法临时禁用交换:
sudo swapoff -a
要永久禁用它,您需要编辑/ etc / fstab文件,并注释掉包含单词swap的任何行。
在Windows上,可以通过系统属性→高级→性能→高级→虚拟内存完全禁用分页文件来实现等效功能。
配置swappiness
Linux系统上可用的另一个选项是确保sysctl值vm.swappiness设置为1.这样可以降低内核的交换趋势,而不会导致在正常情况下进行交换,同时仍允许整个系统在紧急情况下进行交换。
Enable bootstrap.memory_lock
另一个选择是在Linux / Unix系统上使用mlockall,或者在Windows上使用VirtualLock来尝试将进程地址空间锁定到RAM中,从而防止任何弹性内存被替换掉。这可以通过将这行添加到config / elasticsearch.yml文件来完成:
bootstrap.memory_lock: true
注意:如果它尝试分配比可用内存更多的内存,mlockall可能会导致JVM或shell会话退出
启动Elasticsearch后,您可以通过在此请求的输出中检查mlockall的值,看看是否成功应用了此设置:
GET _nodes?filter_path=**.mlockall
如果您看到mlockall为false,则表示mlockall请求失败。您还将在日志中看到一行包含无法锁定JVM内存的单词。
在Linux / Unix系统上最可能的原因是运行Elasticsearch的用户没有锁定内存的权限。这可以授予如下:
.zip和.tar.gz 在启动Elasticsearch之前将ulimit -l unlimited设置为root,或者在/etc/security/limits.conf中将memlock设置为unlimited。 RPM和Debian 在系统配置文件中将MAX_LOCKED_MEMORY设置为无限制(或参见下面的使用systemd的系统)。 系统使用systemd 在systemd配置中将LimitMEMLOCK设置为无穷大。
mlockall可能失败的另一个可能原因是临时目录(通常是/ tmp)是使用noexec选项挂载的。这可以通过使用ES_JAVA_OPTS环境变量指定新的临时目录来解决:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch
或者在jvm.options配置文件中设置此JVM标志。
File Descriptors
Elasticsearch使用大量文件描述符或文件句柄。文件描述符的耗尽可能是灾难性的,很可能导致数据丢失。确保将运行Elasticsearch的用户的打开文件描述符数量的限制增加到65,536或更高。
对于.zip和.tar.gz包,在启动Elasticsearch之前设置ulimit -n 65536为root,或者在/etc/security/limits.conf中将nofile设置为65536。
RPM和Debian软件包已经将文件描述符的最大数目默认为65536,不需要进一步配置。
您可以使用Nodes Stats API检查为每个节点配置的max_file_descriptors,其中包含:
GET _nodes/stats/process?filter_path=**.max_file_descriptors
虚拟内存
Elasticsearch默认使用混合的mmapfs / niofs目录来存储其索引。 mmap计数的默认操作系统限制可能太低,这可能导致内存不足的异常。
在Linux上,您可以通过以root身份运行以下命令来增加限制:
sysctl -w vm.max_map_count=262144
要永久设置此值,请更新/etc/sysctl.conf中的vm.max_map_count设置。要在重新启动后进行验证,请运行sysctl vm.max_map_count。
RPM和Debian软件包将自动配置此设置。不需要进一步配置。
线程数
Elasticsearch使用多个线程池进行不同类型的操作。重要的是,它能够在需要时创建新线程。确保Elasticsearch用户可以创建的线程数至少为2048。
这可以通过在启动Elasticsearch之前设置ulimit -u 2048作为root,或者在/etc/security/limits.conf中将nproc设置为2048来完成。