配置项作用 #
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 |
注意事项 #
默认值: 默认值等于 CPU 核心数,推荐保持。
动态更新: 支持动态更新,无需重启。
I/O 特性: Get 操作是 I/O 密集型,等待时 CPU 可以处理其他请求。
合理设置: 通常不需要超过 CPU 核心数的 2 倍。
队列配合: 应与
queue_size配合调整。监控建议: 监控队列长度和拒绝率。
性能测试: 调整后应进行性能测试。
存储类型: 根据存储延迟调整。
集群一致性: 建议集群中各节点保持一致。
上下文切换: 过多线程会导致频繁的上下文切换。
使用场景 #
场景选择指南
本地 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. 定期审查
├── 定期检查配置
├── 评估性能变化
├── 根据负载调整
└-- 保持优化





