线程池

编辑

节点使用多个线程池来管理内存消耗。与许多线程池关联的队列允许保留待处理的请求,而不是丢弃它们。

有几个线程池,但重要的包括:

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
用于 flushtranslog 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 线程池持有动态数量的线程。此数量与工作负载成正比,并在 coremax 参数的值之间变化。

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 设置有以下几种用例:

  1. 如果您在同一主机上运行多个 Elasticsearch 实例,但希望 Elasticsearch 将其线程池的大小调整为好像它只有一部分 CPU,则应将 node.processors 设置覆盖为所需的分数,例如,如果您在 16 核计算机上运行两个 Elasticsearch 实例,则将 node.processors 设置为 8。请注意,这是一个专家级用例,除了设置 node.processors 设置之外,还需要考虑更多因素,例如更改垃圾收集器线程数、将进程绑定到核心等等。
  2. 有时,处理器数量会被错误地检测到,在这种情况下,显式设置 node.processors 设置将解决此类问题。

为了检查检测到的处理器数量,请使用带有 os 标志的节点信息 API。