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

配置项作用 #

jobscheduler.threadpool.size 配置项用于控制作业调度器线程池的核心线程数量,即同时可以执行的作业调度任务的最大并发数。

此配置决定了作业调度器可以并发处理的任务数量,影响作业调度的吞吐能力和 CPU 资源利用。

配置项属性 #

  • 配置路径: jobscheduler.threadpool.size
  • 数据类型: Integer(整数)
  • 默认值: Runtime.getRuntime().availableProcessors()(CPU 核心数)
  • 最小值: 1
  • 最大值: 建议不超过 CPU 核心数
  • 是否可选: 是(通常自动计算)
  • 作用域: NodeScope(节点级别)
  • 动态更新: 否(需要重启节点生效)

配置项详解 #

工作机制 #

固定线程池模型

Fixed Executor:
├── 核心线程数: size (默认 = CPU 核心数)
├── 队列大小: queue_size (默认 = 200)
├── 线程类型: 固定大小线程池
└── 执行策略: 核心线程始终存活


任务处理流程:

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


执行中的任务:
├── 占用核心线程
├── 完成后线程继续存活
└── 等待下一个任务

默认值计算 #

线程池大小自动计算

默认值:
size = availableProcessors()


获取方式:
Runtime.getRuntime().availableProcessors()


示例:
4 核 CPU:
size = 4


8 核 CPU:
size = 8


16 核 CPU:
size = 16


可通过 node.processors 覆盖:
node.processors: 4
→ size = 4 (无论实际 CPU 核心数)

并发执行分析 #


假设 CPU 有 4 个核心,size = 4

时刻 T0:
任务1 ──→ 核心1 ──→ 执行中 ⚙️
任务2 ──→ 核心2 ──→ 执行中 ⚙️
任务3 ──→ 核心3 ──→ 执行中 ⚙️
任务4 ──→ 核心4 ──→ 执行中 ⚙️
任务5 ──→ 队列 ──→ 等待 ⏸
并发: 4


时刻 T1 (任务1 完成):
任务1 ──→ 完成 ✅
核心1 ──→ 空闲 ──→ 从队列取任务5
任务2 ──→ 核心2 ──→ 执行中 ⚙️
任务3 ──→ 核心3 ──→ 执行中 ⚙️
任务4 ──→ 核心4 ──→ 执行中 ⚙️
任务5 ──→ 核心1 ──→ 执行中 ⚙️
并发: 4

配置建议 #

生产环境(默认) #

# 不需要显式配置,使用默认值
# size = CPU 核心数

建议: 保持默认值(CPU 核心数)。自动适配硬件。

高性能服务器 #

node:
  processors: 16  # 16 核 CPU
jobscheduler:
  threadpool:
    size: 16  # 显式设置

建议: 设置为 CPU 核心数。充分利用 CPU。

混合负载节点 #

node:
  processors: 8
jobscheduler:
  threadpool:
    size: 4  # 限制线程数

建议: 设置为 CPU 核心数的一半。节点承担多种职责时使用。

资源受限环境 #

jobscheduler:
  threadpool:
    size: 2  # 减少线程数

建议: 设置为 2-4。CPU 资源紧张时使用。

代码示例 #

easysearch.yml 基础配置 #

# 通常不需要配置,使用默认值
# size 自动 = CPU 核心数

显式配置大小 #

jobscheduler:
  threadpool:
    size: 8
    queue_size: 500

通过 node.processors 配置 #

node:
  processors: 4
# jobscheduler.threadpool.size 将使用此值

高负载配置 #

jobscheduler:
  threadpool:
    size: 16
    queue_size: 1000
  sweeper:
    period: 10m

相关配置 #

配置项作用默认值
jobscheduler.threadpool.size线程池大小CPU 核心数
jobscheduler.threadpool.queue_size队列大小200
node.processors覆盖 CPU 核心数检测自动检测

性能影响分析 #

size 设置优点缺点
1-2CPU 占用低吞吐量低
CPU/2平衡负载标准设置
CPU(默认)最大吞吐高 CPU 占用
CPU×2不推荐上下文切换高

吞吐量对比 #

假设每个任务执行 100ms

size = 2:
├── 并发执行: 2
├── 每秒处理: 2 × (1000ms / 100ms) = 20 个任务
└── CPU 利用: ~50%


size = 4 (CPU = 4):
├── 并发执行: 4
├── 每秒处理: 4 × (1000ms / 100ms) = 40 个任务
└── CPU 利用: ~100% ✅


size = 8 (CPU = 4):
├── 并发执行: 8 (但只有 4 个核心)
├── 实际吞吐: ~40 个任务
└── CPU 利用: ~100% + 上下文切换开销 ❌

使用场景 #

推荐使用默认值的场景 #

  • 专用节点: 节点专门用于作业调度
  • 标准负载: 任务数量适中
  • CPU 充足: CPU 资源充足
  • 自动适配: 希望自动适配硬件

推荐增加线程数的场景 #

  • 多核 CPU: CPU 核心数很多(如 16 核+)
  • 计算密集: 任务主要是计算密集型
  • 高吞吐需求: 需要更高的吞吐量

推荐减少线程数的场景 #

  • 混合节点: 节点同时承担其他职责
  • IO 密集: 任务主要是等待 IO
  • 资源受限: CPU 资源紧张
  • 稳定性优先: 优先考虑系统稳定性

与队列大小的配合 #

size 和 queue_size 的协同

配置 1: 标准配置
size: 4
queue_size: 200
├── 并发执行: 4
├── 队列等待: 200
├── 总容量: 204
└── 适合: 4 核 CPU


配置 2: 高并发配置
size: 8
queue_size: 500
├── 并发执行: 8
├── 队列等待: 500
├── 总容量: 508
└── 适合: 8 核 CPU


配置 3: 低资源配置
size: 2
queue_size: 100
├── 并发执行: 2
├── 队列等待: 100
├── 总容量: 102
└── 适合: 2 核 CPU

CPU 利用分析 #

不同 size 的 CPU 利用

假设 4 核 CPU,任务为计算密集型

size = 1:
核心1: ████████████ 100%
核心2: ░░░░░░░░░░░░ 0%
核心3: ░░░░░░░░░░░░ 0%
核心4: ░░░░░░░░░░░░ 0%
总利用: 25% ❌


size = 2:
核心1: ████████████ 100%
核心2: ████████████ 100%
核心3: ░░░░░░░░░░░░ 0%
核心4: ░░░░░░░░░░░░ 0%
总利用: 50%


size = 4 (默认):
核心1: ████████████ 100%
核心2: ████████████ 100%
核心3: ████████████ 100%
核心4: ████████████ 100%
总利用: 100% ✅


size = 8:
核心1: ████████████ 100%
核心2: ████████████ 100%
核心3: ████████████ 100%
核心4: ████████████ 100%
总利用: 100% + 上下文切换开销 ❌

注意事项 #

  1. 默认值: 默认为 CPU 核心数,通常最优。

  2. 需要重启: 修改此配置需要重启节点。

  3. 过犹不及: 设置超过 CPU 核心数会增加上下文切换。

  4. node.processors: 可通过 node.processors 覆盖检测值。

  5. 混合负载: 混合节点应减少线程数。

  6. 队列配合: 应与 queue_size 配合配置。

  7. 监控建议: 监控 CPU 利用率和任务完成率。

  8. 测试验证: 配置变更后应验证吞吐量和稳定性。

  9. 计算密集: 计算密集任务建议 size = CPU 核心数。

  10. IO 密集: IO 密集任务可以适当增加 size。

线程池类型 #

Fixed Executor 特点

固定大小线程池:
├── 核心线程数 = 最大线程数
├── 核心线程始终存活
├── 无空闲超时回收
├── 队列满时拒绝任务
└── 适合: 稳定负载场景


与 Cached Executor 对比:

Fixed:
├── 线程数固定
├── 无创建/销毁开销
└── 适合: 长期运行的任务


Cached:
├── 线程数动态增长
├── 有创建/销毁开销
└── 适合: 短期大量任务