线程池
编辑线程池
编辑节点使用多个线程池来管理内存消耗。与许多线程池关联的队列允许保留待处理的请求,而不是丢弃它们。
有几个线程池,但重要的包括:
-
generic
- 用于通用操作(例如,后台节点发现)。线程池类型为
scaling
。
-
search
- 用于分片级别的计数/搜索操作。也用于提取和其他搜索相关操作。线程池类型为
fixed
,大小为int((
已分配的处理器数量
* 3) / 2) + 1
,队列大小为1000
。 -
search_throttled
- 用于
search_throttled 索引
上的计数/搜索/建议/获取操作。线程池类型为fixed
,大小为1
,队列大小为100
。 -
search_coordination
- 用于轻量级搜索相关协调操作。线程池类型为
fixed
,大小为(
已分配的处理器数量
) / 2
,队列大小为1000
。 -
get
- 用于获取操作。线程池类型为
fixed
,大小为int((
已分配的处理器数量
* 3) / 2) + 1
,队列大小为1000
。 -
analyze
- 用于分析请求。线程池类型为
fixed
,大小为1
,队列大小为16
。 -
write
- 用于单文档索引/删除/更新、摄取处理器和批量请求。线程池类型为
fixed
,大小为已分配的处理器数量
,队列大小为10000
。此池的最大大小为1 +
已分配的处理器数量
。 -
snapshot
- 用于快照/恢复操作。线程池类型为
scaling
,保持活动时间为5m
。在堆内存至少为 750MB 的节点上,此池的默认最大大小为10
。在堆内存小于 750MB 的节点上,此池的默认最大大小为min(5, (
已分配的处理器数量
) / 2)
。 -
snapshot_meta
- 用于快照存储库元数据读取操作。线程池类型为
scaling
,保持活动时间为5m
,最大值为min(50, (
已分配的处理器数量
* 3))
。 -
warmer
- 用于段预热操作。线程池类型为
scaling
,保持活动时间为5m
,最大值为min(5, (
已分配的处理器数量
) / 2)
。 -
refresh
- 用于刷新操作。线程池类型为
scaling
,保持活动时间为5m
,最大值为min(10, (
已分配的处理器数量
) / 2)
。 -
fetch_shard_started
- 用于列出分片状态。线程池类型为
scaling
,保持活动时间为5m
,默认最大大小为2 *
已分配的处理器数量
。 -
fetch_shard_store
- 用于列出分片存储。线程池类型为
scaling
,保持活动时间为5m
,默认最大大小为2 *
已分配的处理器数量
。 -
flush
- 用于 flush 和 translog
fsync
操作。线程池类型为scaling
,保持活动时间为5m
,默认最大大小为min(5, (
已分配的处理器数量
) / 2)
。 -
force_merge
- 用于 强制合并 操作。线程池类型为
fixed
,大小为max(1, (
已分配的处理器数量
) / 8)
,并且队列大小无限制。 -
management
- 用于集群管理。线程池类型为
scaling
,保持活动时间为5m
,默认最大大小为5
。 -
system_read
- 用于系统索引上的读取操作。线程池类型为
fixed
,默认最大大小为min(5, (
已分配的处理器数量
) / 2)
。 -
system_write
- 用于系统索引上的写入操作。线程池类型为
fixed
,默认最大大小为min(5, (
已分配的处理器数量
) / 2)
。 -
system_critical_read
- 用于系统索引上的关键读取操作。线程池类型为
fixed
,默认最大大小为min(5, (
已分配的处理器数量
) / 2)
。 -
system_critical_write
- 用于系统索引上的关键写入操作。线程池类型为
fixed
,默认最大大小为min(5, (
已分配的处理器数量
) / 2)
。 -
watcher
- 用于 watch 执行。线程池类型为
fixed
,默认最大大小为min(5 * (
已分配的处理器数量
), 50)
,队列大小为1000
。 -
esql_worker
- 执行 ES|QL 操作。线程池类型为
fixed
,大小为int((
已分配的处理器数量
* 3) / 2) + 1
,队列大小为1000
。
线程池设置是 静态的,可以通过编辑 elasticsearch.yml
来更改。可以通过设置其类型特定的参数来更改特定的线程池;例如,更改 write
线程池中的线程数
thread_pool: write: size: 30
线程池类型
编辑以下是线程池的类型及其各自的参数:
fixed
编辑fixed
线程池持有固定大小的线程来处理请求,并带有一个(可选的)有界队列,用于处理没有线程服务的待处理请求。
size
参数控制线程数。
queue_size
允许控制没有线程执行的待处理请求的队列大小。默认情况下,它设置为 -1
,表示无限制。当请求进入并且队列已满时,它将中止请求。
thread_pool: write: size: 30 queue_size: 1000
scaling
编辑scaling
线程池持有动态数量的线程。此数量与工作负载成正比,并在 core
和 max
参数的值之间变化。
keep_alive
参数确定线程在线程池中空闲多长时间后才会被清除。
thread_pool: warmer: core: 1 max: 8 keep_alive: 2m
已分配的处理器设置
编辑处理器数量是自动检测的,并且线程池设置是基于它自动设置的。在某些情况下,覆盖检测到的处理器数量可能很有用。这可以通过显式设置 node.processors
设置来完成。此设置受可用处理器数量的限制,并且接受浮点数,这在 Elasticsearch 节点配置为在 CPU 限制下运行的环境(例如 Cgroups
下的 cpu shares 或 quota)中非常有用。
node.processors: 2
显式覆盖 node.processors
设置有以下几种用例:
- 如果您在同一主机上运行多个 Elasticsearch 实例,但希望 Elasticsearch 将其线程池的大小调整为好像它只有一部分 CPU,则应将
node.processors
设置覆盖为所需的分数,例如,如果您在 16 核计算机上运行两个 Elasticsearch 实例,则将node.processors
设置为 8。请注意,这是一个专家级用例,除了设置node.processors
设置之外,还需要考虑更多因素,例如更改垃圾收集器线程数、将进程绑定到核心等等。 - 有时,处理器数量会被错误地检测到,在这种情况下,显式设置
node.processors
设置将解决此类问题。
为了检查检测到的处理器数量,请使用带有 os
标志的节点信息 API。