线程池编辑

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

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

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

keep_alive 参数确定线程在不执行任何工作的情况下应在线程池中保留多长时间。

thread_pool:
    warmer:
        core: 1
        max: 8
        keep_alive: 2m

已分配处理器设置编辑

处理器数量会自动检测,线程池设置会根据它自动设置。在某些情况下,覆盖检测到的处理器数量可能很有用。这可以通过显式设置 node.processors 设置来完成。此设置受可用处理器数量的限制,并接受浮点数,这在 Elasticsearch 节点配置为使用 CPU 限制运行的环境中非常有用,例如 Cgroups 下的 cpu 共享或配额。

node.processors: 2

有几种用例需要显式覆盖 node.processors 设置

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

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