线程池
编辑线程池编辑
节点使用多个线程池来管理内存消耗。与许多线程池关联的队列允许保留挂起的请求,而不是丢弃它们。
有几个线程池,但重要的包括
-
generic
- 用于通用操作(例如,后台节点发现)。线程池类型为
scaling
。
-
search
- 用于协调分片级别上的计数/搜索操作,其计算被卸载到 search_worker 线程池。也用于提取和其他与搜索相关的操作。线程池类型为
fixed
,大小为int((
已分配处理器数量
* 3) / 2) + 1
,queue_size 为1000
。 -
search_worker
- 用于可能在同一分片内的多个段之间并发执行的计数/搜索操作的繁重工作负载。线程池类型为
fixed
,大小为int((
已分配处理器数量
* 3) / 2) + 1
,queue_size 无限制。 -
search_throttled
- 用于对
search_throttled 索引
进行计数/搜索/建议/获取操作。线程池类型为fixed
,大小为1
,queue_size 为100
。 -
search_coordination
- 用于轻量级搜索相关协调操作。线程池类型为
fixed
,大小为(
已分配处理器数量
) / 2
,queue_size 为1000
。 -
get
- 用于获取操作。线程池类型为
fixed
,大小为int((
已分配处理器数量
* 3) / 2) + 1
,queue_size 为1000
。 -
analyze
- 用于分析请求。线程池类型为
fixed
,大小为1
,queue_size 为16
。 -
write
- 用于单文档索引/删除/更新、摄取处理器和批量请求。线程池类型为
fixed
,大小为已分配处理器数量
,queue_size 为10000
。此池的最大大小为1 +
已分配处理器数量
。 -
snapshot
- 用于快照/恢复操作。线程池类型为
scaling
,保持活动时间为5 分钟
。在堆内存至少为 750MB 的节点上,此池的最大大小默认为10
。在堆内存小于 750MB 的节点上,此池的最大大小默认为min(5, (
已分配处理器数量
) / 2)
。 -
snapshot_meta
- 用于快照存储库元数据读取操作。线程池类型为
scaling
,保持活动时间为5 分钟
,最大值为min(50, (
已分配处理器数量
* 3))
。 -
warmer
- 用于段预热操作。线程池类型为
scaling
,保持活动时间为5 分钟
,最大值为min(5, (
已分配处理器数量
) / 2)
。 -
refresh
- 用于刷新操作。线程池类型为
scaling
,保持活动时间为5 分钟
,最大值为min(10, (
已分配处理器数量
) / 2)
。 -
fetch_shard_started
- 用于列出分片状态。线程池类型为
scaling
,保持活动时间为5 分钟
,默认最大大小为2 *
已分配处理器数量
。 -
fetch_shard_store
- 用于列出分片存储。线程池类型为
scaling
,保持活动时间为5 分钟
,默认最大大小为2 *
已分配处理器数量
。 -
flush
- 用于 刷新 和 事务日志
fsync
操作。线程池类型为scaling
,保持活动时间为5 分钟
,默认最大大小为min(5, (
已分配处理器数量
) / 2)
。 -
force_merge
- 用于 强制合并 操作。线程池类型为
fixed
,大小为max(1, (
已分配处理器数量
) / 8)
,队列大小无限制。 -
management
- 用于集群管理。线程池类型为
scaling
,保持活动时间为5 分钟
,默认最大大小为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
- 用于 监视执行。线程池类型为
fixed
,默认最大大小为min(5 * (
已分配处理器数量
), 50)
,queue_size 为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 共享或配额。
node.processors: 2
有几种用例需要显式覆盖 node.processors
设置
- 如果您在同一主机上运行多个 Elasticsearch 实例,但希望 Elasticsearch 在调整其线程池大小的时候,就好像它只占用了 CPU 的一部分一样,那么您应该将
node.processors
设置覆盖为您想要的比例。例如,如果您在一台 16 核的机器上运行两个 Elasticsearch 实例,请将node.processors
设置为 8。请注意,这是一个专家级的用例,除了设置node.processors
之外,还需要考虑很多其他因素,例如更改垃圾收集器线程数、将进程绑定到核心等等。 - 有时处理器的数量会被错误地检测到,在这种情况下,显式设置
node.processors
可以解决此类问题。
要检查检测到的处理器数量,请使用带有 os
标志的节点信息 API。