📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

thread_pool.get.size 配置项用于控制文档获取线程池的固定线程数量

Get 线程池专门用于处理文档获取操作(get 请求),是查询性能的关键组件。

配置项属性 #

  • 配置路径: thread_pool.get.size
  • 数据类型: Integer(整数)
  • 默认值: CPU核心数allocatedProcessors
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 是(可以动态更新,无需重启)

配置项详解 #

工作机制 #

Get 线程池架构

线程池类型: FIXED (固定大小)

┌─────────────────────────────────────┐
│  Get 线程池                          │
├─────────────────────────────────────┤
│  线程数: size (默认 = CPU核心数)    │
│  队列: queue_size (默认 1000)        │
│  类型: 固定,不伸缩                  │
└─────────────────────────────────────┘


使用场景:

1. 单文档查询
   ├── GET /index/_doc/1
   ├── 根据ID获取文档
   └-- 返回完整文档


2. 批量查询
   ├── _mget API
   ├── 批量获取文档
   └-- 提高效率


3. 实时获取
   ├── 需要最新数据
   ├── 不经过缓存
   └-- 从磁盘读取


4. 源字段过滤
   ├── _source:false
   ├── 只返回元数据
   └-- 减少网络传输

FIXED 线程池特点 #

FIXED 线程池特性

固定线程数:
├── 创建: 启动时创建 size 个线程
├── 保持: 始终保持活跃
├── 不伸缩: 不增不减
└-- 性能稳定


有界队列:
├── queue_size: 1000
├── 容量: 固定大小
├── 满时: 拒绝新请求
└-- 保护系统


任务执行:
├── 并发执行: size 个任务
├── 等待任务: 最多 1000 个
├── 超过: 拒绝 ❌
└-- 保证稳定性

size 设置影响 #

size 值的影响分析

size = CPU核心数 (默认):
├── 并发能力: 与 CPU 匹配
├── I/O 等待: 良好利用
├── 上下文切换: 最小
├-- 资源利用: 最优 ✅
└-- 适用: 大多数场景 ✅


size = CPU核心数 / 2:
├── 并发能力: 较低
├-- I/O 等待: 未充分利用
├── 上下文切换: 少
├── 资源利用: 不足
└-- 适用: I/O 快的存储


size = CPU核心数 × 2:
├── 并发能力: 较高
├-- I/O 等待: 充分利用
├── 上下文切换: 较多 ⚠️
├── 资源利用: 过度
└-- 适用: 高延迟存储


size > CPU核心数 × 2:
├── 并发能力: 不再提升
├── 上下文切换: 频繁 ❌
├── 性能可能下降 ❌
└-- 不推荐 ❌

为什么默认值是 CPU 核心数 #

默认值设计原理

Get 操作特点:
├── I/O 密集型
│   ├── 从磁盘读取
│   ├── 解压缩
│   └── 反序列化
│
├── 需要 CPU
│   ├── 数据处理
│   ├── 字段提取
│   └── 权限检查
│
└── 混合型操作


为什么是 CPU 核心数:
├── I/O 等待时 CPU 可处理其他请求
├── 平衡 I/O 和 CPU 利用
├-- 最小化上下文切换
├── 最大化吞吐量 ✅
└-- 经过验证的配置

配置建议 #

默认配置(推荐) #

thread_pool:
  get:
    size: 4  # 假设 4 核 CPU

建议: 使用默认值(等于 CPU 核心数)。

高延迟存储 #

thread_pool:
  get:
    size: 8  # 增加线程数

建议: 网络存储或高延迟磁盘时使用。

低延迟存储 #

thread_pool:
  get:
    size: 2  # 减少线程数

建议: 极速 SSD 存储可以使用。

动态更新 #

PUT /_cluster/settings
{
  "transient": {
    "thread_pool.get.size": 8
  }
}

代码示例 #

基础配置 #

thread_pool:
  get:
    size: 4

完整配置 #

thread_pool:
  get:
    size: 4
    queue_size: 1000

单文档获取 #

GET /my_index/_doc/1

批量获取 #

GET /_mget
{
  "docs": [
    {"_index": "my_index", "_id": "1"},
    {"_index": "my_index", "_id": "2"}
  ]
}

查看线程池状态 #

GET /_cat/thread_pool/get?v

相关配置 #

配置项作用默认值
get.size线程池大小CPU核心数
get.queue_size队列大小1000

注意事项 #

  1. 默认值: 默认值等于 CPU 核心数,推荐保持。

  2. 动态更新: 支持动态更新,无需重启。

  3. I/O 特性: Get 操作是 I/O 密集型,等待时 CPU 可以处理其他请求。

  4. 合理设置: 通常不需要超过 CPU 核心数的 2 倍。

  5. 队列配合: 应与 queue_size 配合调整。

  6. 监控建议: 监控队列长度和拒绝率。

  7. 性能测试: 调整后应进行性能测试。

  8. 存储类型: 根据存储延迟调整。

  9. 集群一致性: 建议集群中各节点保持一致。

  10. 上下文切换: 过多线程会导致频繁的上下文切换。

使用场景 #

场景选择指南

本地 SSD (极低延迟):
├── size: CPU核心数
├── 特点: I/O 延迟极低
├-- 并发: 不需要过高
└-- 推荐: 默认配置 ✅


SAN/NAS (中等延迟):
├── size: CPU核心数
├── 特点: I/O 延迟中等
├-- 并发: 默认值合适
└-- 推荐: 默认配置 ✅


网络存储 (高延迟):
├── size: CPU核心数 × 1.5-2
├-- 特点: I/O 等待长
├── 并发: 需要更高
└-- 推荐: 适当增加


混合负载:
├── size: CPU核心数
├── 特点: 多种操作混合
├-- 并发: 平衡配置
└-- 推荐: 默认配置 ✅

性能调优 #

size 值调优指南

调优原则:
├── 从默认值开始
├── 根据存储类型调整
├── 监控性能指标
├── 测试不同配置
└-- 避免过度配置


调优步骤:

1. 评估存储特性
   ├── SSD: 低延迟 → 保持默认
   ├── HDD: 高延迟 → 可以增加
   ├── 网络: 不确定 → 测试决定
   └-- 测量 I/O 延迟


2. 设置初始值
   ├── 默认: CPU 核心数
   ├── 高延迟: × 1.5
   ├── 极高延迟: × 2
   └-- 不建议超过 × 2


3. 监控指标
   ├── 线程池活跃线程数
   ├── 队列长度
   ├── 拒绝率
   ├── 平均响应时间
   └-- CPU 使用率


4. 调整配置
   ├── 队列满 + 拒绝 → 增加
   ├── 队列空 + 线程闲 → 可以减少
   ├── 响应时间增加 → 可能过度
   └-- 找到最佳平衡点


5. 验证效果
   ├── 压力测试
   ├── 性能对比
   ├── 稳定性测试
   └-- 确认最佳配置

最佳实践 #

Get 线程池最佳实践

1. 使用默认值
   ├── size = CPU 核心数
   ├── 最适合大多数场景
   ├── 经过充分验证
   └-- 性能最优 ✅


2. 根据存储调整
   ├── 低延迟存储: 默认值
   ├── 中延迟存储: 默认值
   ├── 高延迟存储: × 1.5
   └-- 极高延迟: × 2


3. 监控队列状态
   ├── 监控队列长度
   ├── 监控拒绝率
   ├── 监控响应时间
   └-- 及时发现问题


4. 配合 queue_size
   ├── 保持默认 1000
   ├── 高并发时可以增加
   ├── 低并发时可以减少
   └-- 平衡资源


5. 定期审查
   ├── 定期检查配置
   ├── 评估性能变化
   ├── 根据负载调整
   └-- 保持优化