elasticsearch 5.x 系列之二 线程池的设置

本贴最后更新于 2100 天前,其中的信息可能已经天翻地覆

1,概述

每个 Elasticsearch 节点内部都维护着多个线程池,如 index、search、get、bulk 等,用户可以修改线程池的类型和大小,以及其他的比如 reflesh, flush,warmer 等,
我们一般需要关注的只是:
index,search,get,bulk 就 ok 了,其他的可以用到的时候再具体进行查看。

2,查看线程组的状态

curl -XGET http://master:9200/_nodes/stats?pretty
如下截取部分 thread_pool 的部分结果:

bulk: {
threads: 2,
queue: 0,
active: 0,
rejected: 0,
largest: 2,
completed: 5
},
generic: {
threads: 5,
queue: 0,
active: 0,
rejected: 0,
largest: 5,
completed: 3027787
},
get: {
threads: 0,
queue: 0,
active: 0,
rejected: 0,
largest: 0,
completed: 0
},
index: {
threads: 0,
queue: 0,
active: 0,
rejected: 0,
largest: 0,
completed: 0
},
search: {
threads: 4,
queue: 0,
active: 0,
rejected: 0,
largest: 4,
completed: 54
},

其中,需要关注的是 rejected。当某个线程池 active==threads 时,表示所有线程都在忙,那么后续新的请求就会进入 queue 中,即 queue>0,一旦 queue 大小超出限制,比如 bulk 的 queue 默认 100,那么 elasticsearch 进程将拒绝请求(碰到 bulk HTTP 状态码 429),相应的拒绝次数就会累加到 rejected 中。
对于被拒绝的请求:我们一般用如下的方法规避。

1、记录失败的请求并重发
2、减少并发写的进程个数,同时加大每次 bulk 请求的 size

核心的线程如下:
generic:通用操作,如 node discovery。它的类型默认为 cached。
index:此线程池用于索引和删除操作。它的类型默认为 fixed,size 默认为可用处理器的数量,队列的 size 默认为 200。
search:此线程池用于搜索和计数请求。它的类型默认为 fixed,size 默认为(可用处理器的数量* 3) / 2) + 1,队列的 size 默认为 1000。
suggest:此线程池用于建议器请求。它的类型默认为 fixed,size 默认为可用处理器的数量,队列的 size 默认为 1000。
get:此线程池用于实时的 GET 请求。它的类型默认为 fixed,size 默认为可用处理器的数量,队列的 size 默认为 1000。
bulk:此线程池用于批量操作。它的类型默认为 fixed,size 默认为可用处理器的数量,队列的 size 默认为 50。
percolate:此线程池用于预匹配器操作。它的类型默认为 fixed,size 默认为可用处理器的数量,队列的 size 默认为 1000。

3,线程池的主要类型如下:

1、cached
无限制的线程池,为每个请求创建一个线程。这种线程池是为了防止请求被阻塞或者拒绝,其中的每个线程都有一个超时时间(keep_alive),默认 5 分钟,一旦超时就会回收/终止。elasticsearch 的 generic 线程池就是用该类型。最近发现 5.0.0-alpha2 版本中去掉了该类型的线程池
2、fixed
有着固定大小的线程池,大小由 size 属性指定,默认是 5*cores 数,允许你指定一个队列(使用 queue_size 属性指定,默认是-1,即无限制)用来保存请求,直到有一个空闲的线程来执行请求。如果 Elasticsearch 无法把请求放到队列中(队列满了),该请求将被拒绝。
3、scaling
可变大小的 pool,大小根据负载在 1 到 size 间,同样 keep_alive 参数指定了闲置线程被回收的时间。

##,4,线程池的配置:
1,可以,在 elasticsearch.yml 进行配置
threadpool.index.type: fixed
threadpool.index.size: 100
threadpool.index.queue_size: 500
2,也可以利用 api 进行设置
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
"transient": {
"threadpool.index.type": "fixed",
"threadpool.index.size": 100,
"threadpool.index.queue_size": 500
}
}'

  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 268 关注
  • 线程
    120 引用 • 111 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...