本地英文版地址: ../en/modules-threadpool.html
一个节点使用若干个线程池来管理内存消耗。 与许多线程池关联的队列允许保留挂起的请求,而不是丢弃。
有若干个线程池,但重要的几个是:
-
generic
-
对应 一般操作(例如,后台节点发现)。其线程池类型为
scaling
-
search
-
对应 count、search、suggest 操作。
其线程池类型为
fixed_auto_queue_size
(自动的固定的队列大小),大小为int((可用的处理器数 * 3) / 2) + 1
,初始队列大小为1000
-
search_throttled
-
对应
搜索节流索引
(search_throttled indices) 上的 count、search、suggest、get 操作。 其线程池类型为fixed_auto_queue_size
(自动的固定的队列大小),大小为1
,初始队列大小为100
-
get
-
对应 get 操作。
其线程池类型为
fixed
(固定的),大小为可用的处理器数
,队列大小为1000
-
analyze
-
对应 分析(analyze) 请求。
其线程池类型为
fixed
(固定的),大小为1
,队列大小为16
-
write
-
对应 单个文档的 index/delete/update 及 批量(bulk) 请求。
其线程池类型为
fixed
(固定的),大小为可用的处理器数
, 队列大小为200
。 线程池最大数量为1 + 可用的处理器数
。 -
snapshot
-
对应 snapshot/restore 操作。
其线程池类型为
scaling
(可扩展的),保持活动状态5m
,最大值为min(5, (可用的处理器数)/2)
。 -
warmer
-
对应 段(segment)的 预热(warm-up) 操作。
其线程池类型为
scaling
(可扩展的),保持活动状态5m
,最大值为min(5, (可用的处理器数)/2)
。 -
refresh
-
对应 刷新(refhresh) 操作。
其线程池类型为
scaling
(可扩展的),保持活动状态5m
,最大值为min(10, (可用的处理器数)/2)
。 -
listener
-
主要用于java客户端在监听器线程设置为
true
时执行操作。 其线程池类型为scaling
(可扩展的),默认最大值为min(10, (可用的处理器数)/2)
。 -
fetch_shard_started
-
对应 列出分片状态。
其线程池类型为
scaling
(可扩展的),保持活动状态5m
,默认最大值为2 * 可用的处理器数
。 -
fetch_shard_store
-
对应 列出分片存储。
其线程池类型为
scaling
(可扩展的),保持活动状态5m
,默认最大值为2 * 可用的处理器数
。 -
flush
-
对应 flush(冲洗)、synced flush(同步冲洗) 及 translog(事务日志)
fsync
操作。 其线程池类型为scaling
(可扩展的),保持活动状态5m
,默认最大值为min(5, 可用的处理器数/2)
。 -
force_merge
-
对应 强制合并(force merge) 操作。
其线程池类型为
fixed
(固定的),大小为 1,队列大小无限制。 -
management
-
对应 集群管理。
其线程池类型为
scaling
(可扩展的),保持活动状态5m
,默认最大值为5
。
可以通过设置特定类型的参数来更改特定的线程池;例如,更改write
线程池中的线程数量:
thread_pool: write: size: 30
以下是线程池的类型及其各自的参数:
fixed
类型的线程池 拥有一个固定大小的线程来处理带有队列(可选有界)的请求,用于处理没有线程为其服务的等待请求。
参数 size
控制线程的数量。
参数 queue_size
允许控制没有线程执行请求的队列大小。
默认情况下,它被设置为-1
,这意味着它是无限制的。
当队列已满时,进来的请求将被终止。
thread_pool: write: size: 30 queue_size: 1000
这个功能是实验性的,可能会在未来的版本中完全更改或删除。 Elastic 将尽最大努力修复任何问题,但实验性功能不受官方 GA 特性的 SLA 支持。
废弃的 [实验性的fixed_auto_queue_size
线程池类型已在 7.7.0 版本废弃,并将在 8.0 版本中移除]
fixed_auto_queue_size
类型的线程池 持有一个固定大小的线程来处理带有一个有界队列的请求,该队列用于处理没有线程为其服务的等待请求。
它类似于fixed
线程池,然而,queue_size
根据 Little’s Law的计算自动调整。
每当 auto_queue_frame_size
操作完成时,这些计算将潜在地将 auto_queue_frame_size
上下调整50。
参数 size
控制线程的数量。
参数 queue_size
允许控制没有线程执行的挂起请求队列的初始大小。
min_queue_size
设置控制queue_size
可调整的最小数量。
min_queue_size
设置控制queue_size
可调整的最大数量。
auto_queue_frame_size
设置控制在队列调整之前进行测量的操作次数。
它应该足够大,使得单个操作不会过度地影响计算。
target_response_time
是一个时间值设置,指示线程池队列中任务的目标平均响应时间。
如果任务经常超过这个时间,线程池队列数将被减小,以便拒绝任务。
thread_pool: search: size: 30 queue_size: 500 min_queue_size: 10 max_queue_size: 1000 auto_queue_frame_size: 2000 target_response_time: 1s
处理器的数量是自动检测的,线程池设置是基于它自动设置的。
在某些情况下,覆盖检测到的处理器数量会很有用。
这可以通过显式设置 node.processors
设置来实现。
node.processors: 2
有几个显式覆盖 node.processors
设置的用例:
-
如果你在同一主机上运行多个 Elasticsearch 实例,但希望 Elasticsearch 调整线程池的大小,就像它只有一部分 CPU 一样,那么应该所需的部分的值来覆盖
node.processors
设置,例如,如果你在一个 16 核的机器上运行两个 Elasticsearch 实例,设置node.processors
为8
。 请注意,这是一个专家级的用例,涉及的内容远不止配置node.processors
设置,因为还有其他考虑事项,如更改垃圾回收器线程的数量、将进程锁定到内核等等。 -
有时检测到的处理器数量是错误的,在这种情况下,显式设置
node.processors
设置可以解决此类问题。
为了检查检测到的处理器数量,使用带有 os
标志的节点信息 API。