此篇记录Elasticsearch8的一些系统配置。
1、更改文件描述符的限制
Elasticsearch使用了大量的文件描述符,它用于表示系统打开的文件的标识符。文件描述符是非负整数,它在操作系统层面被用来唯一标识一个打开的文件、套接字或其他 I/O 资源。每个进程都有一组文件描述符,这些描述符用于跟踪它当前打开的文件和网络连接。
操作系统为每个进程分配一定数量的文件描述符。这个数量是由操作系统的配置和限制决定的。对于 Elasticsearch 来说,文件描述符的限制非常重要,因为 Elasticsearch 需要同时打开许多文件,包括索引文件、写入日志文件、配置文件等。如果文件描述符的限制太低,可能会导致 Elasticsearch 在高负载情况下无法正常工作。
ulimit 命令是用于查看和设置 shell 进程资源限制的命令。
使用以下命令查看当前用户的文件描述符限制:
bash
ulimit -n
临时更改文件描述符的限制:
bash
ulimit -n <new_limit>
永久更改文件描述符的限制,编辑/etc/security/limits.conf文件,加入:
bash
<elasticsearch username> nofile 65535(或更大的值)
Important system configuration | Elasticsearch Guide [8.10] | Elastic
File Descriptors | Elasticsearch Guide [8.10] | Elastic
2、禁用交换设置
在 Elasticsearch 中禁用交换(swapping)的主要原因是性能优化和稳定性考虑。交换是一种操作系统级别的机制,用于在物理内存不足时将部分数据移到磁盘上。尽管这在某些情况下可以帮助系统继续运行,但对于 Elasticsearch 这样的分布式搜索引擎,禁用交换通常是更好的选择。
禁用交换有三种方式:
(1)禁用所有交换文件
临时:
bash
sudo swapoff -a
永久:编辑/etc/fstab文件,将所有包含swap一词的行都注释掉。
(2)配置swappiness
将vm.swappiness值设为1
(3)启用bootstrap.memory_lock
在elasticsearch.yml中,将bootstrap.memory_lock设置为true:
bash
bootstrap.memory_lock: true
同时,还要在/etc/security/limits.conf文件中进行如下配置:
bash
# allow user 'elasticsearch' mlockall
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
将上述命令中的elasticsearch改为实际的elasticsearch用户名。
Disable swapping | Elasticsearch Guide [8.10] | Elastic
3、虚拟内存设置
Elasticsearch 默认使用 mmapfs 目录存储其索引。操作系统对mmap默认的数量限制可能太低,这可能会导致内存不足异常。
mmapfs 是一种文件映射的存储引擎,它使用内存映射文件(mmap)的方式来访问磁盘上的数据。这样的设计可以提高对索引数据的读取速度。
操作系统对 mmap 计数进行了限制,用于控制系统中同时使用的内存映射区域的数量。每个内存映射区域都会占用一定的虚拟内存空间。默认情况下,操作系统可能会设置比较保守的 mmap 计数限制,这是为了确保系统在处理大量并发请求时不会耗尽内存。如果 Elasticsearch 的索引数据量较大,而操作系统对 mmap 计数的限制较低,可能会导致 Elasticsearch 在访问索引数据时出现内存不足的异常。这可能表现为 Out of Memory 异常,导致 Elasticsearch 进程被迫终止或不正常工作。
调整操作系统的 mmap 计数限制:
临时方式:
bash
sysctl -w vm.max_map_count=262144
永久方式:编辑/etc/sysctl.conf文件,加入
bash
vm.max_map_count=262144
修改完,重启ES后,使用以下命令查看:
bash
sysctl vm.max_map_count
Virtual memory | Elasticsearch Guide [8.10] | Elastic
4、调整线程数量
Elasticsearch 是一个高度并发的分布式搜索引擎,为了有效地处理各种操作,它使用了多个线程池。每个线程池专门用于处理特定类型的操作,例如搜索、索引、刷新等。在处理大量并发请求时可能需要大量的线程资源。如果限制过低,可能会导致性能下降、请求排队或拒绝服务等问题。将Elasticsearch 用户能够创建的线程数量至少设置为4096.
临时:
bash
ulimit -u 4096
永久:编辑/etc/security/limits.conf文件,加入
bash
<elasticsearch username> nproc 4096
Number of threads | Elasticsearch Guide [8.10] | Elastic
5、JVM堆大小设置
默认情况下,Elasticsearch 会根据节点的角色和总内存自动设置 JVM 堆大小。 对于大多数生产环境,建议使用默认大小。
要改变默认的堆大小,编辑/$ES_HOME/config/jvm.options文件,设置Xms和Xmx两个参数,它们分别表示JVM堆的初始大小和最大大小。这两个参数的值应该相等,以避免在运行时调整堆大小。二者的值均不能超过总物理内存的50%。