5.4. 自动化控制器容量确定和作业影响
自动化控制器容量系统根据实例可用的资源量以及正在运行的作业的大小(称为影响)来确定可在实例上运行的作业数量。用于确定这一点的算法基于以下两个方面:
-
系统可使用多少内存(
mem_capacity
) -
系统可使用多少个处理容量(
cpu_capacity
)
容量也会影响实例组。由于组由实例组成,因此实例也可以分配到多个组。这意味着,对一个实例的影响可能会影响其他组的整体容量。
实例组而不是实例本身,可以分配给不同级别的作业使用。如需更多信息, 请参阅配置 自动化执行中的集群。
当任务管理器准备其图形来确定作业运行的组时,它会将实例组的容量提交到尚未准备好启动的作业。
在较小的配置中,如果只有一个实例可用于某个作业运行,任务管理器可让该作业在实例上运行,即使它会使实例超额。这样可保证作业不会因为置备系统而卡住。
其他资源
- 有关容器组的详情,请参考 配置自动化执行 中的 实例组和容器组的容量设置。
- 有关分片作业及其对容量的影响的详情,请参考 作业分片执行行为。
5.4.1. 容量算法的资源确定
容量算法确定系统可以同时运行多少个 fork。这些算法控制 Ansible 可以同时与多少个系统通信。增加自动化控制器系统运行的 fork 数量,使作业可以更快地运行,方法是并行执行更多工作。但是,这会增加系统的负载,这可能导致工作变慢。
默认 mem_capacity
可让您超额提交处理资源,同时防止系统内存不足。如果您的大多数工作不是处理器密集型,则选择此模式可最大化 fork 数量。
5.4.1.1. 内存相对容量
mem_capacity
相对于每个 fork 所需的内存量计算。考虑到内部组件的开销,每个分叉大约需要 100MB。在考虑 Ansible 作业可用的内存量时,容量算法保留 2GB 内存,以考虑存在其他服务。其算法公式是:
(mem - 2048) / mem_per_fork
以下是一个示例:
(4096 - 2048) / 100 == ~20
具有 4GB 内存的系统可以运行 20 个分叉。mem_per_fork
值通过设置 SYSTEM_TASK_FORKS_MEM
的值来控制,默认值为 100。
5.4.1.2. CPU 相对容量
Ansible 工作负载通常是处理器密集型。在这种情况下,您可以减少同步工作负载,使更多任务可以更快地运行,并减少这些作业的平均完成时间。
就像 mem_capacity
算法调整每个 fork 所需的内存量一样,cpu_capacity
算法会调整每个 fork 所需的处理资源量。这个基准值是每个内核的四个 fork。其算法公式是:
cpus * fork_per_cpu
例如,4 核系统类似如下:
4 * 4 == 16
您可以通过将 SYSTEM_TASK_FORKS_CPU
的值设置为 4 来控制 fork_per_cpu
的值。
5.4.2. 容量作业影响
在选择容量时,了解每个作业类型对容量的影响非常重要。
Ansible 的默认 fork 值为 5。但是,如果您将自动化控制器设置为针对更少的系统运行,则实际的并发值会较低。
当在自动化控制器中运行作业时,所选的 fork 数量会递增 1,以补充 Ansible 父进程。
Example
如果您针对 5 的五个系统运行 playbook,则从作业影响角度来看,实际的 fork 值为 6。
5.4.2.1. 自动化控制器中作业类型的影响
作业和临时作业遵循前面的模型,分叉 +1。如果在作业模板上设置了 fork 值,则您的作业容量值是提供的 forks 值的最小值,以及您拥有的主机数量,再加上 1。+1 是考虑父 Ansible 进程。
实例容量决定了哪些作业被分配给任何特定实例。如果作业和临时命令具有更高的 fork 值,则使用更多容量。
作业类型包括以下内容,具有固定影响:
- 清单更新:1
- 项目更新:1
- 系统作业:5
如果您没有在作业模板上设置 fork 值,则您的作业将使用 Ansible 的默认 fork 值 5。但是,如果您的作业少于五个主机,它会使用较少的主机。通常,设置 fork 值高于系统能够使问题出现内存不足或过量提交 CPU 时的问题。您使用的作业模板 fork 值必须适合于系统。如果您有使用 1000 个 fork 的 playbook,但您的系统都没有足够容量,则您的系统会降低,并面临性能或资源问题的风险。
5.4.2.2. 选择正确的容量
从 CPU 密集型或内存密集型容量限制中选择容量会在最小或最大分叉数量之间进行选择。在上例中,CPU 容量最多允许 16 个 fork,而内存容量允许 20 个。对于某些系统,它们之间的差别可能较大,您可能希望在两者之间保持平衡。
instance 字段 capacity_adjustment
允许您选择要考虑多少。它表示为 0.0 到 1.0 之间的值。如果设置为 1.0,则使用最大值。上例涉及内存容量,因此可以选择 20 个 fork。如果设置为 0.0,则使用最小值。值 0.5 是两个算法之间的 50/50 平衡,即 18:
16 + (20 - 16) * 0.5 = 18
流程
查看或编辑容量:
-
在导航面板中,选择
。 - 在 Instance Groups 列表视图中,选择所需的实例。
选择 Instances 选项卡,并调整 Capacity 调整 滑块。
注意滑块调整实例容量算法是否产生较少的分叉(在左侧)或产生更多分叉(在右侧)。