aimrt.executor

配置项概述

aimrt.executor配置项用于配置执行器。其中的细节配置项说明如下:

节点

类型

是否可选

默认值

作用

executors

array

可选

[]

执行器列表

executors[i].name

string

必选

“”

执行器名称

executors[i].type

string

必选

“”

执行器类型

executors[i].options

map

可选

-

具体执行器的配置

aimrt.executor的配置说明如下:

  • executors是一个数组,用于配置各个执行器。

    • executors[i].name表示执行器名称。不允许出现重复的执行器名称。

    • executors[i].type表示执行器类型。AimRT 官方提供了几种执行器类型,部分插件也提供了一些执行器类型。

    • executors[i].options是AimRT传递给各个执行器的初始化参数,这部分配置格式由各个执行器类型定义,请参考对应执行器类型的文档章节。

以下是一个简单的示例:

aimrt:
  executor:
    executors:
      - name: xxx_executor
        type: asio_thread
        options:
          thread_num: 2
      - name: yyy_executor
        type: tbb_thread
        options:
          thread_num: 1

simple_thread 执行器

simple_thread执行器是一种简单的单线程执行器,不支持定时调度。其所有的配置项如下:

节点

类型

是否可选

默认值

作用

thread_sched_policy

string

可选

“”

线程调度策略

thread_bind_cpu

unsigned int array

可选

[]

绑核配置

queue_threshold

unsigned int

可选

10000

队列任务上限

使用注意点如下:

  • thread_sched_policythread_bind_cpu参考Common Information中线程绑核配置的说明。

  • queue_threshold配置了队列任务上限,当已经有超过此阈值的任务在队列中时,新任务将投递失败。

以下是一个简单的示例:

aimrt:
  executor:
    executors:
      - name: test_simple_thread_executor
        type: simple_thread
        options:
          thread_sched_policy: SCHED_FIFO:80
          thread_bind_cpu: [0, 1]
          queue_threshold: 10000

asio_thread 执行器

asio_thread执行器是一种基于Asio库实现的执行器,是一种线程池,可以手动设置线程数,此外它还支持定时调度。其所有的配置项如下:

节点

类型

是否可选

默认值

作用

thread_num

unsigned int

可选

1

线程数

thread_sched_policy

string

可选

“”

线程调度策略

thread_bind_cpu

unsigned int array

可选

[]

绑核配置

timeout_alarm_threshold_us

unsigned int

可选

1000000

调度超时告警阈值,单位:微秒

queue_threshold

unsigned int

可选

10000

队列任务上限

use_system_clock

bool

可选

false

是否使用 std::system_clock,默认使用 std::steady_clock

使用注意点如下:

  • thread_num配置了线程数,默认为 1。当线程数配置为 1 时为线程安全执行器,否则是线程不安全的。

  • thread_sched_policythread_bind_cpu参考Common Information中线程绑核配置的说明。

  • timeout_alarm_threshold_us配置了一个调度超时告警的阈值。当进行定时调度时,如果 CPU 负载太重、或队列中任务太多,导致超过设定的时间才调度到,则会打印一个告警日志。

  • queue_threshold配置了队列任务上限,当已经有超过此阈值的任务在队列中时,新任务将投递失败。

  • use_system_clock配置是否使用 std::system_clock 作为时间系统,默认为 false,使用 std::steady_clock。注意使用 std::system_clock 时,执行器的时间将与系统同步,可能会受到外部调节。

以下是一个简单的示例:

aimrt:
  executor:
    executors:
      - name: test_asio_thread_executor
        type: asio_thread
        options:
          thread_num: 2
          thread_sched_policy: SCHED_FIFO:80
          thread_bind_cpu: [0, 1]
          timeout_alarm_threshold_us: 1000
          queue_threshold: 10000
          use_system_clock: false

asio_strand 执行器

asio_strand执行器是一种依附于asio_thread执行器的伪执行器,基于 Asio 库的 strand 实现。它不能独立存在,并不拥有实际的线程,它在运行过程中会将任务交给绑定的asio_thread执行器来实际执行。但是它保证线程安全,也支持定时调度。其所有的配置项如下:

节点

类型

是否可选

默认值

作用

bind_asio_thread_executor_name

string

必选

“”

绑定的asio_thread执行器名称

timeout_alarm_threshold_us

unsigned int

可选

1000000

调度超时告警阈值,单位:微秒

use_system_clock

bool

可选

false

是否使用 std::system_clock,默认使用 std::steady_clock

使用注意点如下:

  • 通过bind_asio_thread_executor_name配置项来绑定asio_thread类型的执行器。如果指定名称的执行器不存在、或不是asio_thread类型,则会在初始化时抛出异常。

  • timeout_alarm_threshold_us配置了一个调度超时告警的阈值。当进行定时调度时,如果 CPU 负载太重、或队列中任务太多,导致超过设定的时间才调度到,则会打印一个告警日志。

  • use_system_clock配置是否使用 std::system_clock 作为时间系统,默认为 false,使用 std::steady_clock。注意使用 std::system_clock 时,执行器的时间将与系统同步,可能会受到外部调节。

以下是一个简单的示例:

aimrt:
  executor:
    executors:
      - name: test_asio_thread_executor
        type: asio_thread
        options:
          thread_num: 2
      - name: test_asio_strand_executor
        type: asio_strand
        options:
          bind_asio_thread_executor_name: test_asio_thread_executor
          timeout_alarm_threshold_us: 1000
          use_system_clock: false

tbb_thread 执行器

tbb_thread是一种基于oneTBB 库的无锁并发队列实现的高性能无锁线程池,可以手动设置线程数,但它不支持定时调度。其所有的配置项如下:

节点

类型

是否可选

默认值

作用

thread_num

unsigned int

可选

1

线程数

thread_sched_policy

string

可选

“”

线程调度策略

thread_bind_cpu

unsigned int array

可选

[]

绑核配置

timeout_alarm_threshold_us

unsigned int

可选

1000000

调度超时告警阈值,单位:微秒

queue_threshold

unsigned int

可选

10000

队列任务上限

使用注意点如下:

  • thread_num配置了线程数,默认为 1。当线程数配置为 1 时为线程安全执行器,否则是线程不安全的。

  • thread_sched_policythread_bind_cpu参考Common Information中线程绑核配置的说明。

  • timeout_alarm_threshold_us配置了一个调度超时告警的阈值。当进行定时调度时,如果 CPU 负载太重、或队列中任务太多,导致超过设定的时间才调度到,则会打印一个告警日志。

  • queue_threshold配置了队列任务上限,当已经有超过此阈值的任务在队列中时,新任务将投递失败。

以下是一个简单的示例:

aimrt:
  executor:
    executors:
      - name: test_tbb_thread_executor
        type: tbb_thread
        options:
          thread_num: 2
          thread_sched_policy: SCHED_FIFO:80
          thread_bind_cpu: [0, 1]
          timeout_alarm_threshold_us: 1000
          queue_threshold: 10000

time_wheel 执行器

time_wheel执行器是一种基于时间轮实现的执行器,一般用于有大量定时任务、且对定时精度要求不高的场景,例如 RPC 超时处理。它会启动一个单独的线程跑时间轮,同时也支持将具体的任务投递到其他执行器中执行。其所有的配置项如下:

节点

类型

是否可选

默认值

作用

bind_executor

string

可选

“”

绑定的执行器

dt_us

unsigned int

可选

1000

时间轮 tick 的间隔,单位:微秒

wheel_size

unsigned int array

可选

[1000, 600]

各个时间轮的大小

thread_sched_policy

string

可选

“”

时间轮线程的调度策略

thread_bind_cpu

unsigned int array

可选

[]

时间轮线程的绑核配置

使用注意点如下:

  • bind_executor用于配置绑定的执行器,从而在时间达到后将任务投递到绑定的执行器里具体执行。

    • 如果不绑定其他执行器,则所有的任务都会在时间轮线程里执行,有可能阻塞时间轮的 Tick。

    • 如果不绑定其他执行器,则本执行器是线程安全的。如果绑定其他执行器,则线程安全性与绑定的执行器一致。

    • 如果绑定的执行器不存在,则会在初始化时抛出一个异常。

  • dt_us是时间轮算法的一个参数,表示 Tick 的间隔。间隔越大,定时调度的精度越低,但越节省 CPU 资源。

  • wheel_size是时间轮算法的另一个参数,表示各个时间轮的大小。比如默认的参数[1000, 600]表示有两个时间轮,第一个轮的刻度是 1000,第二个轮的刻度是 600。如果 Tick 时间是 1ms,则第一个轮的完整时间是 1s,第二个轮的完整时间是 10min。一般来说,要让可能的定时时间都落在轮内最好。

  • thread_sched_policythread_bind_cpu参考Common Information中线程绑核配置的说明。

以下是一个简单的示例:

aimrt:
  executor:
    executors:
      - name: test_tbb_thread_executor
        type: tbb_thread
        options:
          thread_num: 2
      - name: test_time_wheel_executor
        type: time_wheel
        options:
          bind_executor: test_tbb_thread_executor
          dt_us: 1000
          wheel_size: [1000, 600]
          thread_sched_policy: SCHED_FIFO:80
          thread_bind_cpu: [0]