5.4. 自动化控制器容量确定和作业影响
自动化控制器容量系统根据实例可用的资源量以及正在运行的作业的大小(称为影响)来确定可在实例上运行的作业数量。用于确定这一点的算法基于以下两个方面:
-
系统可使用多少内存(
mem_capacity) -
系统可使用多少个处理容量(
cpu_capacity)
容量也会影响实例组。由于组由实例组成,因此实例也可以分配到多个组。这意味着,对一个实例的影响可能会影响其他组的整体容量。
实例组而不是实例本身,可以分配给不同级别的作业使用。如需更多信息, 请参阅配置 自动化执行中的集群。
当任务管理器准备其图形来确定作业运行的组时,它会将实例组的容量提交到尚未启动的作业。
在较小的配置中,如果只有一个实例可用于某个作业运行,任务管理器可让该作业在实例上运行,即使它会使实例超额。这样可保证作业不会因为置备系统而卡住。
5.4.1. 容量算法的资源确定 复制链接链接已复制到粘贴板!
容量算法确定系统可以同时运行多少个 fork。这些算法控制 Ansible 可以同时与多少个系统通信。
增加自动化控制器系统运行的 fork 数量,使作业可以更快地运行,方法是并行执行更多工作。但是,这会增加系统的负载,这可能导致工作变慢。
默认 mem_capacity 可让您超额提交处理资源,同时防止系统内存不足。如果您的大多数工作不是处理器密集型,则选择此模式可最大化 fork 数量。
5.4.1.1. 内存相对容量 复制链接链接已复制到粘贴板!
memory relative capacity 选项允许您设置基于系统上可用内存在控制器上运行的最大并发任务(fork)数。此设置对于内存是运行 Ansible 作业的一个限制因素的系统很有用。
mem_capacity 相对于每个 fork 所需的内存量计算。考虑到内部组件的开销,每个分叉大约需要 100MB。在考虑 Ansible 作业可用的内存量时,容量算法保留 2GB 内存,以考虑存在其他服务。其算法公式是:
(mem - 2048) / mem_per_fork
(mem - 2048) / mem_per_fork
以下是一个示例:
(4096 - 2048) / 100 == ~20
(4096 - 2048) / 100 == ~20
具有 4GB 内存的系统可以运行 20 个分叉。mem_per_fork 值通过设置 SYSTEM_TASK_FORKS_MEM 的值来控制,默认值为 100。
5.4.1.2. CPU 相对容量 复制链接链接已复制到粘贴板!
自动化控制器使用 cpu_capacity 算法来确定受管节点的相对 CPU 容量。此信息用于优化可用节点之间的任务分布。
Ansible 工作负载通常是处理器密集型。在这种情况下,您可以减少同步工作负载,使更多任务可以更快地运行,并减少这些作业的平均完成时间。
就像 mem_capacity 算法调整每个 fork 所需的内存量一样,cpu_capacity 算法会调整每个 fork 所需的处理资源量。这个基准值是每个内核的四个 fork。其算法公式是:
cpus * fork_per_cpu
cpus * fork_per_cpu
例如,4 核系统类似如下:
4 * 4 == 16
4 * 4 == 16
您可以通过将 SYSTEM_TASK_FORKS_CPU 的值设置为 4 来控制 fork_per_cpu 的值。
5.4.2. 容量作业影响 复制链接链接已复制到粘贴板!
在配置自动化控制器容量时,了解不同的作业类型对系统容量的影响非常重要。
自动化控制器使用 Ansible 运行作业。根据用于作业的 fork 数量,每个作业可能会对系统资源产生不同的影响。
Ansible 的默认 fork 值为 5。这意味着,默认情况下,每个作业可以同时在五个系统上运行任务。
但是,如果您将自动化控制器设置为针对更少的系统运行,则实际的并发值会较低。
当在自动化控制器中运行作业时,所选的 fork 数量会递增 1,以补充 Ansible 父进程。
例如,如果您针对五个 fork 值为 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 绑定算法根据实例可用的 CPU 内核数计算 fork 数量。
内存密集型算法根据实例可用的内存量计算 fork 数量。默认情况下,自动化控制器选择由这两个算法计算的最小 fork 数量。这是为了确保实例不会过量使用资源。然而,在某些情况下,您可能需要调整此行为。
从 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
16 + (20 - 16) * 0.5 = 18
流程
-
在导航面板中,选择
。 - 在 Instance Groups 列表视图中,选择所需的实例。
选择 Instances 选项卡,并调整 Capacity 调整 滑块。
注意滑块调整实例容量算法是否产生较少的分叉(在左侧)或产生更多分叉(在右侧)。