线程

参考线程教程:从一次 SQL 查询的全过程看 DolphinDB 的线程模型

DolphinDB 采用多线程技术,有以下几种常见的线程类型:

  • worker:常规交互作业的工作线程,接收客户端请求,将任务分解为多个小任务,根据任务的粒度自己执行或者发送给 local executor 或 remote executor 执行。

    自 2.00.7 版本开始,DolphinDB 引入了多级任务算法,即将作业及其拆分出来的子任务区分为不同的层级,并分配给相应层级的 worker 来处理。DolphinDB 提供了0~4个级别的 worker。 客户端提交至节点的作业为0级,由0级 worker 处理。根据作业所涉及到的分区,0级 worker 将作业分解为多个子任务,其中本地节点上的子任务由0级 worker 与 local executor 并行执行;需要由远程节点执行的子任务则降低为1级,并通过 remote executor 发送到对应节点上的1级 worker 处理。以此类推,若某个级别的子任务需要进一步拆解,则拆分出来的由远程节点执行的子任务降低一级,发送至远程节点上对应层级的 worker 处理。 这种根据任务层级分配不同层级 worker 的线程工作机制,可以有效避免因各个子任务执行期间彼此依赖而导致的死锁问题。

  • local executor:本地执行线程。worker 拆解完任务后生成的本地子任务队列,由同一节点下的local executor 执行。每个 local executor 一次只能处理一个子任务,所有工作线程共享本地执行线程。plooppeach 等并行计算函数的计算任务在本地执行线程完成。

  • remote executor:远程执行线程,将子任务发动到远程节点的独立线程。每个节点有且只有一个远程执行线程。远程执行线程具有容错机制。在多个计算机都包含任务所需数据的副本的情况下,如果一台计算机出现故障,远程执行线程将该任务发送到另一台计算机。

  • batch job worker:批处理作业的工作线程。其上限通过配置项 maxBatchJobWorker 设置,默认值是workerNum。该线程在任务执行完后若闲置60秒则会被系统自动回收,不再占用系统资源。

  • dynamic worker:动态工作线程,作为 worker 的补充。其上限通过配置项 maxDynamicWorker 设置,默认值是 workerNum。如果所有的工作线程被占满,有新任务时,系统会创建动态工作线程来执行任务。根据系统并发任务的繁忙程度,总共可以创建三组动态工作线程,每一个级别可以创建 maxDynamicWorker 个动态工作线程。该线程在任务执行完后若闲置60秒则会被系统自动回收,不再占用系统资源。

  • web worker:处理 HTTP 请求的工作线程。DolphinDB 提供了基于 web 的集群管理界面,用户可以通过web 与 DolphinDB 节点进行交互。其上限通过配置项 webWorkerNum 设置,默认值是1。

  • urgent worker:紧急工作线程,只接收一些特殊的系统级任务,譬如登录,取消作业等。其上限通过配置项 urgentWorkerNum 设置,默认为1。

注意:worker 和 local executor 的数量直接决定了系统的并发计算的能力。

相关配置参数:

配置参数

解释

workerNum

常规作业的工作线程的数量。默认值是 CPU 的内核数。

localExecutors=3

本地执行线程的数量。默认值是 CPU 内核数减1。

remoteExecutors=1

远程执行线程的数量。默认值是 1,建议配置为集群节点数减1。

maxBatchJobWorker=4

批处理作业的最大工作线程数量。默认值是 workerNum 的值。

maxDynamicWorker=4

动态工作线程数量的最大值。默认值是 workerNum 的值。

webWorkerNum=1

处理HTTP请求的工作线程的数量。默认值是1。

urgentWorkerNum=1

紧急工作线程的数量。默认值是1。

maxDynamicLocalExecutor=3

配置本地动态执行线程数量上限,默认取 localExecutors 的值。系统启动时会自动创建 localExecutors 线程,若任务执行耗时过长,会动态创建 DynamicLocalExecutor,以避免出现卡顿的情况。

注意:为了避免生成过多的动态执行线程,增大 CPU 线程切换的开销,系统至少间隔 5s才会生成一个新的动态执行线程。

2.00.6 新版功能: 参数 maxDynamicLocalExecutor