Elasticsearch5进阶-设置(5)重要系统配置

理想情况下,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来完成。

转载于:https://my.oschina.net/shibuyisha/blog/983725

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值