线程
参考线程教程:从一次 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 一次只能处理一个子任务,所有工作线程共享本地执行线程。ploop、peach 等并行计算函数的计算任务在本地执行线程完成。
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