ES 线程池配置记录
查看线程池配置
Req
1 | GET _nodes/thread_pool |
Response
1 |
|
字段解释
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: 线程空闲时保活的时间,适用于动态线程池类型。
- type: 线程池类型(如
线程池名称及其功能
- bulk:
- 处理批量索引和删除操作的线程池。
- 常用于大规模数据导入。
- fetch_shard_started:
- 处理分片初始化时的获取操作线程池。
- 用于当一个分片启动时,从主节点获取分片数据。
- fetch_shard_store:
- 处理分片恢复时的获取操作线程池。
- 用于从其他节点获取分片数据以恢复。
- flush:
- 处理定期刷新操作的线程池。
- 用于将内存中的索引数据刷新到磁盘。
- force_merge:
- 处理强制合并操作的线程池。
- 用于减少段文件数量,优化索引的读取性能。
- generic:
- 通用线程池,处理不属于特定线程池的任务。
- 用于各种非特定类型的后台任务。
- get:
- 处理文档检索操作的线程池。
- 用于单文档读取操作。
- index:
- 处理单个文档索引操作的线程池。
- 用于实时索引操作。
- listener:
- 处理内部事件通知的线程池。
- 用于节点之间的事件通知。
- management:
- 处理内部管理任务的线程池。
- 用于集群管理任务。
- refresh:
- 处理定期刷新操作的线程池。
- 用于定期刷新索引以使新数据可见。
- search:
- 处理搜索操作的线程池。
- 用于用户查询操作。
- snapshot:
- 处理快照操作的线程池。
- 用于创建和恢复快照操作。
- warmer:
- 处理索引预热操作的线程池。
- 用于在新段文件可见之前进行预热。
- write:
- 处理写操作的线程池。
- 用于批量写入操作和索引操作。
- bulk:
值的解释
generic
线程池类型为fixed
,表示线程池大小是固定的。size
为 4,表示线程池中有 4 个线程。queue_size
为 -1,表示队列大小无限制。active
为 0,表示当前没有活动线程。largest
为 4,表示曾经的最大活动线程数为 4。completed
为 100,表示线程池中已完成 100 个任务。rejected
为 0,表示没有被拒绝的任务。core
和max
都为 4,表示核心线程数和最大线程数都是 4。keep_alive
为0s
,表示线程不会因为空闲而终止。
配置线程池
write 和 search 的限制可以设置多少呢?
Elasticsearch 允许你在配置文件 elasticsearch.yml
中设置线程池的大小和队列大小,以便根据你的需求进行优化。write
和 search
线程池的限制可以通过以下配置项进行设置:
推荐的设置方法
设置具体数值时,需要根据你的集群规模、节点的硬件配置(CPU 核心数、内存大小等)以及工作负载类型来确定合适的值。
1. Write 线程池
- size:
write
线程池的线程数。一个合理的默认值是 CPU 核心数的 1-2 倍。如果你的写入负载较高,可以适当增加。 - queue_size:
write
线程池的队列大小。一个合理的默认值是 200-500,具体数值取决于你的负载和内存情况。
示例:
1 | thread_pool.write.size: 32 |
2. Search 线程池
- size:
search
线程池的线程数。一个合理的默认值是 CPU 核心数的 1-2 倍。如果你的查询负载较高,可以适当增加。 - queue_size:
search
线程池的队列大小。一个合理的默认值是 1000,具体数值取决于你的负载和内存情况。
示例:
1 | thread_pool.search.size: 64 |
具体建议
- 监控和调整: 开始时可以使用较为保守的设置,然后通过监控 Elasticsearch 的性能指标(如 CPU 使用率、线程池队列大小、任务拒绝次数等)来调整这些值。
- 避免过大设置: 设置过大的线程池和队列可能会导致资源竞争和性能问题,应根据实际需求进行调整。
- 硬件匹配: 确保设置的线程池大小与硬件资源匹配,避免资源过度分配或不足。
示例配置
假设你的服务器有 8 核 CPU 和 32 GB 内存,可以从以下设置开始:
1 | thread_pool.write.size: 16 |
动态调整线程池配置
从 Elasticsearch 7.0 开始,部分线程池配置支持动态调整。你可以使用 Elasticsearch 的 _cluster/settings
API 来动态调整这些配置,而不需要重启集群。
示例:
1 | PUT /_cluster/settings |
通过这些配置和调整,你可以优化 Elasticsearch 的 write
和 search
线程池,以满足你的工作负载需求。
选择线程池类型的指南
- 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 线程池类型是更合适的选择。