Elasticsearch 6.3官方教程翻译系列(2.4):重要的系统配置

原创 esjson 搜索引擎 2289

2.4 重要的系统配置

理想情况下,Elasticsearch应该在服务器上独立运行并使用可用的所有资源。
为此,您需要配置您的操作系统以允许运行Elasticsearch的用户能访问比默认允许的资源更多的资源。

在投入生产之前必须考虑以下设置:

  • 禁用交换
  • 增加文件描述符
  • 确保足够的虚拟内存
  • 确保足够的线程
  • JVM DNS缓存设置

开发模式与生产模式
默认情况下,Elasticsearch假定您正在开发模式下工作。
如果以上任何设置配置不正确,则会向日志文件写入警告,但您可以启动并运行Elasticsearch节点。

只要配置network.host等网络设置,Elasticsearch就会假定您正在转向生产,并将上述警告升级为异常。
这些异常将阻止您的Elasticsearch节点启动。
这是一项重要的安全措施,可确保您不会由于配置错误的服务器而丢失数据。

2.4.1 配置系统设置

配置系统设置的位置取决于您用于安装Elasticsearch的软件包以及您正在使用的操作系统。

使用.zip或.tar.gz软件包时,可以配置系统设置:

  • 临时的用 ulimit 或者
  • 永久的在 /etc/security/limits.conf 配置

使用RPM或Debian软件包时,大多数系统设置都在系统配置文件中设置。
但是,使用systemd的系统要求在系统配置文件中指定系统限制。

ulimit

在Linux系统上,可以使用ulimit临时更改资源限制。
在切换到将运行Elasticsearch的用户之前,通常需要将限制设置为超级用户。
例如,要将打开文件句柄(ulimit -n)的数量设置为65,536,可以执行以下操作:

# 成为root用户
sudo su  
# 更改打开文件的最大数量
ulimit -n 65536 
# 成为elasticsearch用户以启动Elasticsearch。
su elasticsearch

新的限制仅适用于当前会话。
您可以使用ulimit -a查阅所有当前应用的限制。

/etc/security/limits.conf

在Linux系统上,可以通过编辑/etc/security/limits.conf文件为特定用户设置持久限制。
要将elasticsearch用户的最大打开文件数设置为65,536,请将以下行添加到limits.conf文件中:

elasticsearch  -  nofile  65536

此更改仅在elasticsearch用户下次打开新会话时生效。

注意:Ubuntu和limits.conf
Ubuntu忽略由init.d启动的进程的limits.conf文件。
要启用limits.conf文件,请编辑/etc/pam.d/su并取消注释以下行:

```
# session    required   pam_limits.so
```

Sysconfig file

使用RPM或Debian软件包时,可以在系统配置文件中指定系统设置和环境变量,该文件位于:

RPM : /etc/sysconfig/elasticsearch

Debian: /etc/default/elasticsearch

但是,对于使用systemd的系统,系统限制需要通过systemd指定。

Systemd configuration

在使用systemd的系统上使用RPM或Debian软件包时,必须通过systemd指定系统限制。

systemd服务文件(/usr/lib/systemd/system/elasticsearch.service)包含默认应用的限制。

要覆盖它们,请添加一个名为/etc/systemd/system/elasticsearch.service.d/override.conf的文件(或者,您可以运行sudo systemctl edit elasticsearch,它将在默认编辑器中自动打开文件)。
设置此文件中的任何更改,例如:

[Service]
LimitMEMLOCK=infinity

完成后,运行以下命令重新加载单位:

sudo systemctl守护进程重新加载

2.4.2 禁用交换

大多数操作系统尝试尽可能多地为文件系统缓存使用内存,并急切地更换未使用的应用程序内存。这可能会导致部分JVM堆或甚至其可执行页面被换出到磁盘。

交换对性能非常不利,对于节点稳定性,应该不惜一切代价来避免。它可能导致垃圾收集持续几分钟而不是几毫秒,并且可能导致节点响应缓慢甚至与群集断开连接。在弹性分布式系统中,让操作系统杀死节点会更有效。

有三种方法禁用交换。首选选项是完全禁用交换。如果这不是一个选项,是否希望最小化swappiness与内存锁定取决于您的环境。

禁用所有交换文件

通常Elasticsearch是在一个盒子上运行的唯一服务,其内存使用情况由JVM选项控制。应该不需要启用交换。

在Linux系统上,可以运行以下命令临时禁用交换:

sudo swapoff -a

要永久禁用它,您需要编辑/ etc / fstab文件并注释掉任何包含swap单词的行。

在Windows上,可通过完全禁用页面文件通过系统属性→高级→性能→高级→虚拟内存来实现等效功能。

配置swappiness

Linux系统上的另一个可用选项是确保sysctl值vm.swappiness设置为1.这会降低内核的交换趋势,并且不应导致在正常情况下交换,同时仍允许整个系统在紧急情况下进行交换。

启用bootstrap.memory_lock

另一种选择是在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是错误的,那么这意味着mlockall请求失败。您还将在日志中看到包含无法锁定JVM内存的更多信息。

在Linux /Unix系统上,最可能的原因是运行Elasticsearch的用户没有权限锁定内存。这可以授予如下:

  • .zip and .tar.gz

    在启动Elasticsearch之前用root用户执行ulimit -l unlimited,或者在/etc/security/limits.conf中将memlock设置为unlimited。

  • RPM and Debian

    在系统配置文件中将MAX_LOCKED_MEMORY设置为unlimited(或者参阅下面的systemd系统)。

  • Systems using systemd

    在systemd配置中将LimitMEMLOCK设置为infinity。

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标志。

2.4.3 文件描述符

注意:这只适用于Linux和MacOS,如果在Windows上运行Elasticsearch,可以放心地忽略它。
在Windows上,JVM使用的API仅受可用资源的限制。

Elasticsearch使用了大量的文件描述符或文件句柄。
用完文件描述符可能是灾难性的,并且很可能导致数据丢失。确保将运行Elasticsearch的用户的打开文件描述符数限制增加到65,536或更高。

对于.zip和.tar.gz软件包,请在启动Elasticsearch之前使用root用户设置为ulimit -n 65536,或者在/etc/security/limits.conf中将nofile设置为65536。

在macOS上,您还必须将JVM选项-XX:-MaxFDLimit传递给Elasticsearch,以便使用更高的文件描述符限制。

RPM和Debian软件包已经将文件描述符的最大数量默认为65536,并且不需要进一步的配置。

您可以使用Nodes Stats API检查为每个节点配置的max_file_descriptors,其中包含:

GET _nodes/stats/process?filter_path=**.max_file_descriptors

2.4.4 虚拟内存

Elasticsearch默认使用mmapfs目录来存储其索引。
操作系统的mmap计数的默认限制可能太低,这可能会导致内存不足的异常。

在Linux上,可以通过以root身份运行以下命令来增加限制:

sysctl -w vm.max_map_count=262144

要永久设置此值,请更改/etc/sysctl.conf文件中的vm.max_map_count配置。要在重新启动后进行验证,请运行sysctl vm.max_map_count。

RPM和Debian软件包将自动配置此设置。不需要进一步的配置。

2.4.5 线程数

Elasticsearch针对不同类型的操作使用多个线程池。能够在需要时创建新线程很重要。确保Elasticsearch用户可以创建的线程数至少为4096。

这可以通过在启动Elasticsearch之前 用root用户设置ulimit -u 4096,或者通过在/etc/security/limits.conf文件中将nproc设置为4096来完成。

在systemd下作为服务运行时的包分发将自动配置Elasticsearch进程的线程数。不需要额外的配置。

2.4.6 DNS缓存设置

Elasticsearch与安全管理器一起运行。使用安全管理器时,JVM默认无限期地缓存正向主机名解析。

如果您的Elasticsearch节点在DNS解析度随时间变化的环境中依赖于DNS(例如,用于节点到节点发现),那么您可能需要修改默认的JVM行为。

这可以通过将networkaddress.cache.ttl = <timeout>添加到Java安全策略来修改。任何未能解决的主机都将被记录。还要注意,在安装了Java安全管理器的情况下,JVM默认将缓存负面主机名解析十秒钟。这可以通过将networkaddress.cache.negative.ttl = <timeout>添加到Java安全策略来修改。

Elasticsearch 教程 原创

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

关于我

过所爱的生活,爱所过的生活,快乐的生活,才能生活快乐,快乐的工作,才有快乐人生,生活的理想其实就是理想的生活!