ES 线程池配置记录

查看线程池配置

Req

1
GET _nodes/thread_pool

Response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

{
"cluster_name" : "elasticsearch",
"nodes" : {
"node_id" : {
"name" : "node_name",
"thread_pool" : {
"generic" : {
"type" : "fixed",
"size" : 4,
"queue_size" : -1,
"active" : 0,
"largest" : 4,
"completed" : 100,
"rejected" : 0,
"core" : 4,
"max" : 4,
"keep_alive" : "0s"
},
"get" : {
"type" : "fixed",
"size" : 8,
"queue_size" : 1000,
"active" : 0,
"largest" : 8,
"completed" : 1000,
"rejected" : 0,
"core" : 8,
"max" : 8,
"keep_alive" : "0s"
},
...
}
}
}
}

字段解释

  • cluster_name: 集群的名称。

  • nodes

    : 包含集群中各个节点的信息。

    • node_id

      : 节点的唯一标识符。

      • name: 节点的名称。

      • thread_pool

        : 节点上不同线程池的配置信息。

        • generic

          : 线程池名称(如

          1
          generic

          ,

          1
          get

          ,

          1
          index

          ,

          1
          search

          等等)。

          • type: 线程池类型(如 fixed, scaling 等)。
          • size: 线程池中的线程数量。
          • queue_size: 线程池队列的大小。-1 表示无限制。
          • active: 当前活动的线程数量。
          • largest: 曾经达到的最大活动线程数量。
          • completed: 线程池中已完成的任务数量。
          • rejected: 被拒绝的任务数量。
          • core: 核心线程数(通常与 size 相同)。
          • max: 最大线程数(通常与 size 相同)。
          • keep_alive: 线程空闲时保活的时间,适用于动态线程池类型。
  • 线程池名称及其功能

    1. bulk:
      • 处理批量索引和删除操作的线程池。
      • 常用于大规模数据导入。
    2. fetch_shard_started:
      • 处理分片初始化时的获取操作线程池。
      • 用于当一个分片启动时,从主节点获取分片数据。
    3. fetch_shard_store:
      • 处理分片恢复时的获取操作线程池。
      • 用于从其他节点获取分片数据以恢复。
    4. flush:
      • 处理定期刷新操作的线程池。
      • 用于将内存中的索引数据刷新到磁盘。
    5. force_merge:
      • 处理强制合并操作的线程池。
      • 用于减少段文件数量,优化索引的读取性能。
    6. generic:
      • 通用线程池,处理不属于特定线程池的任务。
      • 用于各种非特定类型的后台任务。
    7. get:
      • 处理文档检索操作的线程池。
      • 用于单文档读取操作。
    8. index:
      • 处理单个文档索引操作的线程池。
      • 用于实时索引操作。
    9. listener:
      • 处理内部事件通知的线程池。
      • 用于节点之间的事件通知。
    10. management:
      • 处理内部管理任务的线程池。
      • 用于集群管理任务。
    11. refresh:
      • 处理定期刷新操作的线程池。
      • 用于定期刷新索引以使新数据可见。
    12. search:
      • 处理搜索操作的线程池。
      • 用于用户查询操作。
    13. snapshot:
      • 处理快照操作的线程池。
      • 用于创建和恢复快照操作。
    14. warmer:
      • 处理索引预热操作的线程池。
      • 用于在新段文件可见之前进行预热。
    15. write:
      • 处理写操作的线程池。
      • 用于批量写入操作和索引操作。

值的解释

  • generic 线程池类型为 fixed,表示线程池大小是固定的。
  • size 为 4,表示线程池中有 4 个线程。
  • queue_size 为 -1,表示队列大小无限制。
  • active 为 0,表示当前没有活动线程。
  • largest 为 4,表示曾经的最大活动线程数为 4。
  • completed 为 100,表示线程池中已完成 100 个任务。
  • rejected 为 0,表示没有被拒绝的任务。
  • coremax 都为 4,表示核心线程数和最大线程数都是 4。
  • keep_alive0s,表示线程不会因为空闲而终止。

配置线程池

write 和 search 的限制可以设置多少呢?

Elasticsearch 允许你在配置文件 elasticsearch.yml 中设置线程池的大小和队列大小,以便根据你的需求进行优化。writesearch 线程池的限制可以通过以下配置项进行设置:

推荐的设置方法

设置具体数值时,需要根据你的集群规模、节点的硬件配置(CPU 核心数、内存大小等)以及工作负载类型来确定合适的值。

1. Write 线程池

  • size: write 线程池的线程数。一个合理的默认值是 CPU 核心数的 1-2 倍。如果你的写入负载较高,可以适当增加。
  • queue_size: write 线程池的队列大小。一个合理的默认值是 200-500,具体数值取决于你的负载和内存情况。

示例:

1
2
thread_pool.write.size: 32
thread_pool.write.queue_size: 500

2. Search 线程池

  • size: search 线程池的线程数。一个合理的默认值是 CPU 核心数的 1-2 倍。如果你的查询负载较高,可以适当增加。
  • queue_size: search 线程池的队列大小。一个合理的默认值是 1000,具体数值取决于你的负载和内存情况。

示例:

1
2
thread_pool.search.size: 64
thread_pool.search.queue_size: 2000

具体建议

  • 监控和调整: 开始时可以使用较为保守的设置,然后通过监控 Elasticsearch 的性能指标(如 CPU 使用率、线程池队列大小、任务拒绝次数等)来调整这些值。
  • 避免过大设置: 设置过大的线程池和队列可能会导致资源竞争和性能问题,应根据实际需求进行调整。
  • 硬件匹配: 确保设置的线程池大小与硬件资源匹配,避免资源过度分配或不足。

示例配置

假设你的服务器有 8 核 CPU 和 32 GB 内存,可以从以下设置开始:

1
2
3
4
5
thread_pool.write.size: 16
thread_pool.write.queue_size: 500

thread_pool.search.size: 32
thread_pool.search.queue_size: 1000

动态调整线程池配置

从 Elasticsearch 7.0 开始,部分线程池配置支持动态调整。你可以使用 Elasticsearch 的 _cluster/settings API 来动态调整这些配置,而不需要重启集群。

示例:

1
2
3
4
5
6
7
8
9
PUT /_cluster/settings
{
"persistent": {
"thread_pool.write.size": 16,
"thread_pool.write.queue_size": 500,
"thread_pool.search.size": 32,
"thread_pool.search.queue_size": 1000
}
}

通过这些配置和调整,你可以优化 Elasticsearch 的 writesearch 线程池,以满足你的工作负载需求。

选择线程池类型的指南

  • fixed:适用于工作负载相对稳定的场景,线程数和队列大小可以提前预估和固定。
  • scaling:适用于工作负载波动较大的场景,线程池可以动态扩展和缩减,以应对负载变化。
  • fixed_auto_queue_size:适用于需要自动调整队列大小以优化性能的场景,尤其是在负载波动时。

scaling 和 fixed_auto_queue_size 怎么选?

  • scaling

    • 需要配置核心线程数(core)、最大线程数(max)和空闲线程存活时间(keep_alive),可能稍微复杂一些。
    • 动态调整机制需要监控和调优,以确保在各种负载情况下性能最优。
  • fixed_auto_queue_size

    • 需要配置固定的线程数(size)、最小队列大小(min_queue_size)和最大队列大小(max_queue_size),相对简单。
    • 主要关注队列大小的动态调整,无需频繁调优线程数。
  • 如果你的系统负载变化频繁且难以预估,或者你希望最大化资源利用和最小化响应时间,scaling 线程池类型是更好的选择。

  • 如果你的系统负载较为稳定,但偶尔有高峰,且你希望保持配置和管理的简单性,fixed_auto_queue_size 线程池类型是更合适的选择。


2024 | ixs.im
此情此景, [随机]吟诗一首: