1、配置之前了解ES的集群拓扑结构
您需要确定您的部署拓扑,以便做出正确的Elasticsearch配置决策。
当我们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的连接组成一个集群,
在默认情况下,集群中的每个节点都可以处理Http请求和集群节点的数据传输。
集群中的所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。
了解节点的类别,如下
主节点(master):node.master:true node.data:false
数据节点(data):node.master:false node.data:true
客户端/路由节点(client):node.master:false node.data:false
1
2
3
默认情况下,节点同时是主节点和数据节点,这适合小集群(3个节点);大于3个节点后,分离主节点和数据节点变得非常重要。
2、线程池大小配置
尽量不要动这个配置,如果要动,建议改为:
int(( 核心数 * 3 )/ 2 )+ 1 。
同时满足:不允许bulk和’indexing’线程池的大小大于CPU内核数。
举例:24核处理器,检索服务器是24核,所以:线程池的大小=(24*3)/2+1=37,
同时要满足cpu核数为24。37和24取最小值,应该选择24。
默认的队列大小是1000,
现在的问题是:并发请求数据超过了队列最大的大小,导致出错。
可能的解决方案:
1)、增加队列大小;(太大了,可能会导致内存溢出)
2)、增加节点数和副本数。
队列大小:
在elasticsearch.yml中新增如下配置(5.X已经验证):
## Threadpool Settings ##
# Search pool
thread_pool.search.size: 24
thread_pool.search.queue_size: 2000
# Bulk pool
thread_pool.bulk.size: 24
thread_pool.bulk.queue_size: 1000
# Index pool
thread_pool.index.size: 24
thread_pool.index.queue_size: 1000
1
2
3
4
5
6
7
8
9
10
11
12
13
如果你的批量请求数目高于队列大小,将会出现RemoteTransportException异常。
3、堆内存大小设置。
Elasticsearch 默认安装后设置的堆内存是 1 GB。
修改方式一:
如下环境变量修改方式,指定堆内存大小为4g。
export ES_HEAP_SIZE=4g
修改方式二:
命令行启动设置方式。
./bin/elasticsearch -Xmx4g -Xms4g
修改方式三:(5.x版本建议)
修改 jvm.options配置文件。
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms4g
-Xmx4g
1
2
3
4
确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程。
修改后查看:
[elasticsearch@4da2 bin]$ ps -ef | grep elasticsearch
root 17501 17474 0 Sep13 pts/2 00:00:00 su elasticsearch
500 20389 1 17 04:31 pts/2 00:00:47 /usr/java/jdk1.8.0_91/bin/java -Xms4g -Xmx4g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/opt/elasticsearch -cp /opt/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
1
2
3
注意:
最大可分配堆内存大小为:
32GB与当前ES宿主机内存二者的最小值。
举例1):ES宿主机内存:128GB,可供分配的堆内存:32GB。(建议31GB)
举例2):ES宿主机内存:32GB,可供分配的堆内存:16GB。
4、禁止swapping操作
在你的 elasticsearch.yml 文件中的Memory部分,修改设置如下:
bootstrap.memory_lock : true
1
核心原因:内存交换 到磁盘对服务器性能来说是 致命 的。
早期的版本叫:bootstrap.mlockall,5.X版本改名为:bootstrap.memory_lock。
参考:
bootstrap.memory_lock: true导致Elasticsearch启动失败问题的解决方案:
http://www.cnblogs.com/zhzhang/p/6741070.html
5、修改文件描述符数目(ok)
切换到ES的启动账户,如Elasticsearch。
步骤1)、设置环境变量。
vim /etc/profile
1
增加
ulimit -n 65535
1
用以设定同一时间打开的文件数的最大值为65535。
source /etc/profile 使得命令生效。
步骤2)、修改limits.conf配置文件。
/etc/security/limits.conf
1
增加
* soft nofile 65536
* hard nofile 65536
1
2
用来限制打开文件数65535
步骤3)、切换到Elasticsearch用户,使用ulit -a 查看是否修改成功。
[root@4da2 elasticsearch]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 516047
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
核心原因: Elasticsearch 在节点和 HTTP 客户端之间进行通信也使用了大量的套接字(注:sockets)。 所有这一切都需要足够的文件描述符。
而: 许多现代的 Linux 发行版本,每个进程默认允许一个微不足道的 1024 文件描述符。这对一个小的 Elasticsearch 节点来说实在是太 低 了,更不用说一个处理数以百计索引的节点。
6、修改 最大映射数量 MMP
Elasticsearch 对各种文件混合使用了 NioFs( 非阻塞文件系统)和 MMapFs ( 内存映射文件系统)。
请确保你配置的最大映射数量,以便有足够的虚拟内存可用于 mmapped 文件。这可以暂时设置:
sysctl -w vm.max_map_count=262144
1
或者你可以在 /etc/sysctl.conf 通过修改 vm.max_map_count 永久设置它。
[root@4ad config]# tail -f /etc/sysctl.conf
vm.max_map_count=262144
1
2
实施生成环境或者部署ES环境供使用之前,请仔细核对以上清单列表。
小结
确保ES的高性能是一个永恒的话题,还有很长的路要走。
让我们一起精进,高效习得ES技能!
[1] 5.X版本的配置变化:
https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_50_settings_changes.html
[2] 线程池大小问题
https://github.com/elastic/elasticsearch/issues/15582
[3] swap配置
https://www.elastic.co/guide/en/elasticsearch/reference/master/setup-configuration-memory.html