运行时线程池配置
资产网关和企业网关运行时组件的实现包括一个可配置的工作线程池。这些线程是在运行时进程的上下文中运行的操作系统线程。这些工作线程执行各种任务,包括支持:
- 执行触发器动作
- 读取设备变量
- 与外部进程的通信,包括工作台和事务服务器。
工作线程池的原始实现将被称为线程池 V1.0。工作线程池的新的、可选的实现将被称为线程池 V2.0。
线程池 V1.0 是资产网关和企业网关的默认配置。其功能可以根据您的系统和应用设计和资源使用量进行配置。
对于大多数应用,线程池 V1.0 的实现和可配置的功能提供了应用设计和资源使用量所需的系统行为。
线程池 V2.0 是资产网关和企业网关的可选配置。其功能可以根据您的系统和应用设计和资源使用量进行配置。
对于一些资源使用量高的应用程序,线程池 V2.0 的实现和可配置的功能提供了应用设计和资源使用量所需的系统行为改进。
从 18.1.2 版本开始,线程池 V2.0 作为一个可选的功能包含在内。
运行时线程池选项
线程池的配置是一个高级主题。在大多数情况下,将根据您与您的支持代表的互动,将您引导到这些信息和配置选项。
线程池测量值、系统变量和默认值
其中一些测量值存在于测量值文件中。其他测量值不存在于提供的测量值文件中,但在代码中有一个默认值。
对于一个节点来说,许多测量值及其当前值可以通过 Workbench(工作台) -> Administration(帐户管理) -> System Variables(系统变量)选项卡来查看。
以下部分列出的默认值是大多数资产网关和企业网关产品的默认值。一些系统资源有限的产品对某些测量值有不同的默认值。如果有问题,可以通过 Workbench(工作台) -> Administration(帐户管理) -> System Variables(系统变量)选项卡查看节点的值。
线程池 V1.0
线程池 V1.0 实现的可配置功能的可用测量值,以及相关的系统变量有:
- 最小线程数:
- 运行时初始化期间启动的工作线程数。
- 在运行时期间,基于动态工作线程分配和去分配逻辑,工作线程的数量不会低于这个数字。
- 默认值为:
- 资产网关:pool.threads.min=10。
- 企业网关:pool.threads.min=20。
- 系统变量为:pool.queue.threads.min。
- 最大线程数:
- 同时创建/激活的最大工作线程数。
- 当工作项数量超过当前工作线程数量时,将创建一个新的工作线程。
- 当前工作线程的数量达到这个最大值之后,新的工作线程将不会被创建。
- 取而代之的是,对新的工作项进行排队,等待当前工作线程完成其工作项并可用于处理排队的工作项。
- 默认值为:
- 资产网关:pool.threads.max=20。
- 企业网关:pool.threads.max=100。
- 系统变量为:pool.queue.threads.max。
- 闲置线程数:
- 当一个工作线程完成了其工作项,并且没有更多的工作需要处理时,有一个逻辑来控制工作线程是否应该退出操作系统。
该逻辑包括在工作线程退出之前,在若干次迭代中不再寻找新的工作项。
默认值为:
资产网关:pool.threads.idle_count=10。
企业网关:pool.threads.idle_count=10。
系统变量为:pool.queue.threads.idle_count。
-
处理器线程在运行时初始化时静态分配:
- 处理器线程用于与外部进程通信,包括工作台和事务服务器。
-
默认值为:
-
资产网关:processor.threads=5。
-
企业网关:processor.threads=10。
-
-
系统变量为:
-
processor.0-x.executing。
-
processor.queue.depth。
processor.queue.depth 系统变量中的数值不断增加或为一个稳定的高值(超过个位数的数值)可能表明应该增加 processor.threads 测量值。
除了增加线程池 V1.0 实现所用的 processor.threads 测量值外,还可以选择使用线程池 V2.0 实现。 -
processor.queue.watermark。
-
-
工作线程限制器百分比:
- 能够并发处理特定工作项类型的最大工作线程的百分比。
- 系统默认为:pool.concurrency.limit=40。
- 系统变量为:pool.max_concurrent_executions。
- 线程堆栈大小:
- 每个工作线程的堆栈大小,以字节为单位。
- 默认值是:pool.threads.stack=65536。
- 系统变量为:pool.queue.threads.stack。
线程池 V2.0
线程池 V2.0 的实现:
- 启用,并具有测量值
- 具有与线程池 V1.0 实现不同的功能
- 可以使用测量值进行配置。
要启用线程池 V2.0 实现,请添加测量值:pool.v2.enabled=true。
- 建议将此测量值添加到用户定义的测量值文件中,如 user.solution.properties。有关更多信息,请参见测量值文件管理。
这将在重启运行时和读取测量值时启用线程池 V2 实现。
这将使 V2 的实现出现以下变更:
-
- 处理器池线程被转移到工作线程池中。这使得之前专用的处理器线程可以利用作为工作线程池一部分的动态线程分配和限制逻辑。
- 移除去分配闲置工作线程的逻辑。
- 如果一个系统需要大量的工作线程(在最大线程数测量值内),那么它有可能在未来需要大量的工作线程。
- 移除去分配逻辑后,就可以移除判断一个空闲线程是否应该退出的开销。
- 处理器池线程被转移到工作线程池中。这使得之前专用的处理器线程可以利用作为工作线程池一部分的动态线程分配和限制逻辑。
线程池 V2.0 实现的可配置功能的可用测量值,以及相关的系统变量有:
- 最小线程数:
- 这个概念已移除。没有使用 pool.threads.min 测量值。
- 这个概念已移除。没有使用 pool.threads.min 测量值。
- 最大线程数:
- 没有使用线程池 V1.0 测量值 pool.threads.max,而是使用 pool.v2.threads.max。
- 运行时初始化期间启动的工作线程数。
- 如果当前的、正在使用的工作线程数量达到这个最大值,则不会创建新的工作线程。
- 取而代之的是,对新的工作项进行排队,等待当前工作线程完成其工作项并可用于处理排队的工作项。
- 默认值为:
- 资产网关:pool.v2.threads.max=120。
- 企业网关:pool.v2.threads.max=500。
- 系统变量为:pool.v2.threads.max。
- 工作线程限制器计数。在线程池 V2.0 实现中,这是一个线程数,而不是最大线程数的百分比:
- 没有使用线程池 V1.0 的测量值 pool.limiter.count,而是使用 pool.v2.limiter.count。
- 当达到工作线程计数限制时,系统将创建一个队列,并将该特定任务工作类型的所有新工作项放入该队列中。
- 默认值为:
- 资产网关:pool.v2.limiter.count=40。
- 企业网关:pool.v2.limiter.count=150。
- 系统变量为:pool.v2.limiter.count。
- 线程堆栈大小:
- 每个工作线程的堆栈大小,以字节为单位。
- 默认值是:pool.threads.stack=65536。
- 系统变量为:pool.queue.threads.stack。
测量值文件管理
有关测量值文件管理的信息,包括在产品安装或产品更新期间的文件覆盖,请参见测量值文件管理。