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

配置项作用 #

jobscheduler.threadpool.queue_size 配置项用于控制作业调度器线程池中待处理任务队列的最大容量

此配置限制了线程池队列中可以排队的任务数量。当队列满时,新提交的任务将被拒绝。队列大小影响任务的排队能力和内存占用。

配置项属性 #

  • 配置路径: jobscheduler.threadpool.queue_size
  • 数据类型: Integer(整数)
  • 默认值: 200
  • 最小值: 0(不允许排队)
  • 最大值: 受系统内存限制
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 是(支持动态更新)

配置项详解 #

工作机制 #

线程池队列模型

Fixed Executor Builder:
├── 核心线程数: threadpool.size (默认 = CPU 核心数)
├── 队列大小: queue_size (默认 = 200)
└── 拒绝策略: 队列满时拒绝任务


任务处理流程:

新任务提交
    │
    ↓
核心线程空闲?
    │
    ├──── 是 → 直接执行 ✅
    │
    └──── 否 → 队列未满?
                │
                ├──── 是 → 加入队列 ⏸
                │
                └──── 否 → 拒绝任务 ❌


队列中任务等待:
├── 等待核心线程空闲
├── 空闲后从队列取出执行
└── 执行完成

队列状态分析 #

queue_size = 200 (默认)

状态 1: 队列空闲
├── 已用: 0
├── 可用: 200
└── 接受新任务 ✅


状态 2: 队列半满
├── 已用: 100
├── 可用: 100
└── 接受新任务 ✅


状态 3: 队列接近满
├── 已用: 190
├── 可用: 10
└── 接受新任务 ⚠️


状态 4: 队列已满
├── 已用: 200
├── 可用: 0
└── 拒绝新任务 ❌

内存占用分析 #

队列内存占用估算

假设每个任务对象约 1KB

queue_size = 200:
队列内存: 200 × 1KB = 200 KB
峰值内存: ~200 KB ✅


queue_size = 500:
队列内存: 500 × 1KB = 500 KB
峰值内存: ~500 KB


queue_size = 1000:
队列内存: 1000 × 1KB = 1 MB
峰值内存: ~1 MB


queue_size = 5000:
队列内存: 5000 × 1KB = 5 MB
峰值内存: ~5 MB ⚠️

配置建议 #

生产环境(默认) #

jobscheduler:
  threadpool:
    queue_size: 200  # 默认值

建议: 保持默认值 200。适用于大多数场景。

高负载环境 #

jobscheduler:
  threadpool:
    queue_size: 500  # 增加队列大小

建议: 增加到 500-1000。任务提交频繁时使用。

资源受限环境 #

jobscheduler:
  threadpool:
    queue_size: 100  # 减少队列大小

建议: 减少到 100。内存受限时使用。

不允许排队 #

jobscheduler:
  threadpool:
    queue_size: 0  # 不允许排队

建议: 设置为 0。需要任务快速失败时使用。

代码示例 #

easysearch.yml 基础配置 #

jobscheduler:
  threadpool:
    queue_size: 200

高负载配置 #

jobscheduler:
  threadpool:
    size: 8
    queue_size: 500

资源受限配置 #

jobscheduler:
  threadpool:
    size: 4
    queue_size: 100

动态更新配置 #

PUT /_cluster/settings
{
  "transient": {
    "jobscheduler.threadpool.queue_size": 500
  }
}

相关配置 #

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

性能影响分析 #

queue_size 设置优点缺点
0立即反馈,无内存占用高并发时频繁拒绝
100内存占用小队列容易满
200(默认)平衡容量和内存标准设置
500-1000容纳更多任务内存占用较大
5000+最大容量内存占用很大

吞吐量对比 #

假设任务执行时间 100ms,threadpool.size = 4

queue_size = 0:
├── 无队列缓存
├── 并发: 4
└── 拒绝率高 ❌


queue_size = 200:
├── 队列缓存: 200 个任务
├── 等待时间: 200 / 4 × 100ms = 5 秒
└── 拒绝率低 ✅


queue_size = 1000:
├── 队列缓存: 1000 个任务
├── 等待时间: 1000 / 4 × 100ms = 25 秒
└── 拒绝率很低 ✅

使用场景 #

推荐使用默认值的场景 #

  • 标准环境: 任务提交频率适中
  • 平衡需求: 平衡吞吐量和内存
  • 常规硬件: 标准服务器配置

推荐增加队列大小的场景 #

  • 任务突发: 任务提交有突发高峰
  • 可以等待: 任务可以容忍较长等待
  • 充足内存: 节点内存充足
  • 减少拒绝: 希望减少任务拒绝

推荐减少队列大小的场景 #

  • 内存受限: 节点内存紧张
  • 快速失败: 希望任务快速失败
  • 实时性要求: 任务需要及时处理
  • 低并发: 任务提交频率低

与线程池大小的配合 #

queue_size 和 size 的协同

配置 1: 标准配置
size: 4 (CPU 核心)
queue_size: 200
├── 并发执行: 4
├── 队列等待: 200
└── 总容量: 204 个任务


配置 2: 高并发配置
size: 8
queue_size: 500
├── 并发执行: 8
├── 队列等待: 500
└── 总容量: 508 个任务


配置 3: 低内存配置
size: 2
queue_size: 50
├── 并发执行: 2
├── 队列等待: 50
└── 总容量: 52 个任务

任务拒绝处理 #

队列满时的处理

queue_size = 200, 当前队列已满

新任务提交:
    │
    ↓
核心线程忙 + 队列满
    │
    ↓
抛出 EsRejectedExecutionException
    │
    ↓
任务被拒绝 ❌


处理策略:
├── 增加 queue_size
├── 增加 threadpool.size
├── 减少任务提交频率
└── 实现重试机制

动态更新影响 #

配置更新的影响

queue_size: 200 → 500

当前队列状态:
├── 已用: 150 个任务
├── 旧队列大小: 200
└── 可用: 50


更新后队列状态:
├── 已用: 150 个任务(保持)
├── 新队列大小: 500
└── 可用: 350 ✅


新任务可以继续排队,不会影响已有任务

注意事项 #

  1. 默认值: 默认值为 200,适用于大多数场景。

  2. 动态更新: 支持动态更新,修改后立即生效。

  3. 内存占用: 队列大小直接影响内存占用。

  4. 任务拒绝: 队列满时会拒绝新任务。

  5. 与线程数配合: 应与 threadpool.size 配合配置。

  6. 等待时间: 队列越大,任务等待时间可能越长。

  7. 监控建议: 监控队列使用情况和拒绝率。

  8. 测试验证: 配置变更后应验证任务处理能力。

  9. 重启生效: 某些版本可能需要重启才能生效。

  10. 合理设置: 过大的队列可能导致内存压力。