配置缩放

可以通过配置缩放设置来管理托管 DevOps 池实例的性能和成本。 有关定价和性能的信息,请参阅管理成本和性能

代理状态

可以将池配置为:

  • 无状态:为每个作业提供一个新的代理。
  • 有状态:允许在多个作业之间共享代理。

池的默认设置是无状态的,每次设置时都可以使用 Fresh 代理 来实现。 在某些情况下,团队可能希望重复使用代理来重用在上一管道运行期间创建的包或文件。 生成工作负荷是团队希望保留状态并重用代理的常见场景。 可以通过托管 DevOps 池实现有状态池,同时兼顾安全最佳做法。 默认情况下,最多可以重复使用代理 7 天,但你可以将其配置为更快地回收。

注意

安全代理建议用户使用无状态池来防御供应链攻击。 请每次使用代理状态设置Fresh 代理

无状态池

配置无状态代理时,会为每个作业购买一个新代理。 作业完成后,将放弃代理。

若要详细了解无状态代理的生命周期以及如何在 Azure Pipelines 中使用它们,请参阅 “代理生命周期和分配中的潜在延迟 ”部分。

显示无状态代理的屏幕截图。

每次将 代理状态 设置为 Fresh 代理时,都会为每个作业购买一个新代理。 作业完成后,将丢弃代理。

有状态池

显示有状态代理的屏幕截图。

当启用同一代理可以被多个构建使用"kind": "stateful"(资源模板中的设置或 { "stateful": {...} } Azure CLI 中的设置)时,池中的代理变为有状态的。 可以使用以下设置配置有状态池:

  • 备用代理的最大生存时间maxAgentLifetime)配置有状态池中代理在被关闭和移除之前可以运行的最长运行时长。 备用代理的最长生存期格式为 dd.hh:mm:ss备用代理的最长生存期默认值设置为允许的最大持续时间 7 天 (7.00:00:00)。

  • 宽限期gracePeriodTimeSpan)配置有状态池中的代理在所有当前作业和排队作业完成后,等待新作业的时间,然后再关闭。 宽限期的格式为 dd.hh:mm:ss,默认值为无宽限期。

    重要说明

    如果作业在 备用代理最长生存时间 到期时运行,除非作业运行时间超过两天,否则代理在作业完成之前不会关闭。 托管 DevOps 池中的单个作业最多可以运行两天,即使这些作业在备用代理上运行,其配置时间超过两天,以便 为备用代理提供最长生存时间。 如果工作流要求运行一个需要两天以上才能完成的单个作业,请联系支持人员。

无状态池中的代理在每次作业后都会关闭并丢弃。 如果满足以下任一条件,状态池中的代理将继续运行:

  • 如果第一个作业完成时又有作业排队,Managed DevOps Pools 会将排队作业发送到运行第一个作业的代理,而不是将其关闭。
  • 如果为池配置了宽限期,代理将在宽限期指定的持续时间内等待新作业,然后再关闭。
  • 如果启用了备用代理,并且代理映像符合活动预配期的条件,代理会继续运行并等待作业。

在有状态池中运行的代理,如果在备用代理的最长存活时间内连续运行,即使之前的条件成立,也将关闭并丢弃这些代理。 例如,如果 为备用代理配置了最长生存时间 三天,并且 备用代理模式 设置为 “手动”、“全周方案”(计算机可用 24/7),则代理在连续三天的运行时间后重新启动。

重要说明

如果没有宽限期、没有备用代理的活动预配期,并且没有与代理匹配的排队作业,则在作业完成后,有状态池中的代理仍可被关闭和丢弃。 当代理被废弃时,任何状态都将丢失。

宽限期为具有一致负载的管道运行有状态池提供了最经济高效的方法。 宽限期不需要使用备用代理模式来使代理保持联机状态并准备好接受作业。

备用代理模式

创建池时, 备用代理模式 默认处于关闭状态。 当备用代理模式关闭时,没有备用代理可以立即分配给管道。 管道可能需要等待几分钟到 15 分钟,以便按需预配代理。 为了获得更好的性能,请启用备用代理模式并配置为工作负荷提供容量的备用代理计划。

配置备用代理计划时,托管 DevOps 池会定期将预配代理计数与当前预配方案中指定的备用代理计数进行比较。 它根据需要启动新代理以保持备用代理的数量。 可以使用 “代理 ”窗格查看池中的代理的当前状态和计数。

重要说明

方案中的预配计数不能大于在池设置中配置的“最大代理”值。

可以使用以下设置配置备用代理模式:

  • 关闭:备用代理模式处于关闭状态,并在作业排队时按需预配代理。
  • 手动:配置手动备用计划。
  • 自动:根据代理使用历史记录使用自动备用计划。 可以针对成本和性能对其进行配置。

显示备用代理模式选择的屏幕截图。

手动

手动模式最适合了解其持续集成和持续交付(CI/CD)管道使用模式的团队。 使用手动选项时,需要定义预预配方案。 根据你对池中最有可能使用的代理以及可能使用的代理数的理解来定义方案。 指定满足预计需求的代理的预配计数。

可以创建自己的预配计划,也可以从其中一个预定义的计划中进行选择。 可以将时区配置为用于指定计划。 预配时区的默认值为 (UTC) 协调世界时

可以通过以下三种方式之一配置手动备用代理:

每个预预配快速入门都有以下常见设置(除了特定于该快速入门的设置):

  • 预配置时区:允许您在预配置方案中配置时间段的时区。 预配时区的默认值为 (UTC) 协调世界时
  • 备用代理百分比:配置每个映像所需的备用代理百分比。 可以输入 * 以确保所有映像都被平等预配,或者可以指定 0 到 100 之间的整数来表示百分比。 如果指定百分比,所有映像的总和必须等于 100。 如果只有一个映像,请指定 * 或 100。 使用 Azure 资源管理器模板(ARM 模板)时,可以在本节中配置images设置。 有关详细信息,请参阅配置映像

显示手动待机模式的屏幕截图。

从头开始

如果选择从头开始,则可以添加预配周期列表作为预配方案。 每个预配周期由开始日、结束日、时区、开始时间、结束时间和计数组成。 预配时段不能相互重叠。

属性 说明
多天 选择此选项时,可以为预配方案配置 “开始日”“结束日 ”。
直到下一个时间段 选择此选项时,预配周期从 “开始时间” 值运行到下一个预配周期的开始。
开始日期 预配时段开始的日期。
结束日期 预配期结束的日期。 如果选择 “多天” ,则为必需。
开始时间 预配周期开始的时间。
结束时间 预配期结束的时间。 必须选择,除非选中直至下一个周期
计数 要预配的备用代理数量。 此数字必须大于零,并且不能大于池设置中的“最大代理”值。

创建预配期后,可以从 预预配方案 列表中删除或编辑时间段。

以下示例演示如何配置一个手动方案,其中一个代理程序在星期一的凌晨 12:00 到早上 5:00(EST)进行预配。

显示手动缩放方案的屏幕截图。

工作日方案

如果选择工作日方案,则可以指定开始时间和结束时间,在该时间之间,指定的备用代理数在每个工作日处于备用状态。

属性 说明
开始时间 预配周期开始的时间。
结束时间 预配期结束的时间。
预配计数 要预配的备用代理数量。 此数字必须大于零,并且不能大于池设置中配置的最大代理值。

以下示例使用东部时间(UTC-5)将四个代理配置为在工作时间使用,在非工作时间和周末没有代理。

显示工作日方案的屏幕截图。

全周方案

如果选择一周全天候方案,则可以指定希望始终可用的代理数量。

显示全周方案的屏幕截图。

自动

如果不知道使用模式,并且想要依赖基于过去数据的自动预测,请选择“ 自动”。 可以使用滑块的五个选项在成本和代理性能之间找到平衡。 托管 DevOps 池会对您过去三周的历史数据(如果有的话)运行查询。 它将池中的排队会话按五分钟的时间段来组织,并在每小时分配指定的百分位数,以避免工作负载峰值。

  • 最经济高效MostCostEffective): 第 10 百分位。
  • 更具成本效益MoreCostEffective):第25百分点。
  • 均衡 (默认)(Balanced):第 50 百分位。
  • 更多性能:第 75 百分位数。
  • 最佳性能BestPerformance):第90百分位。

显示自动缩放设置的屏幕截图。

代理的生命周期和分配的潜在延迟

使用 无状态 方案启用备用代理时,需要先安装和配置 Azure Pipelines 代理,然后再从 就绪 状态过渡到 已分配 状态并运行管道。

托管 DevOps 池在预配新代理时,尝试下载最新的 Azure Pipelines 代理 ,以确保在待命代理转换为就绪状态之前,代理已被下载。 启动、连接和开始作业可能需要 10 秒到 1 分钟,具体取决于池的 SKU 速度、使用的镜像和网络负载。 此外,在管道作业中指定某些设置时,可能会导致重新加载并运行其他代理。 代理的回归和回滚也会导致重新加载代理。

就绪代理 始终可能存在潜在的延迟,因为托管 DevOps 池以“瞬态”方式使用此代理,这意味着我们每个作业启动并运行一次任务代理。 如果发现现成代理从 Azure DevOps 提取作业时出现延迟,请考虑以下问题:

  • 是否已准备好代理? 最常见的问题是对何时应预先预配代理的误解。 满足以下条件时,必须从头开始启动计算机:
    • 排队作业的数量大于一个池中备用代理的数量。
    • 作业在预配调度之外排队。
    • 备用代理计数设置为空。
  • 您是否正在正确配置拥有多个映像的备用代理? 如果不通过使用 ImageOverride 需求来指定在管道中使用的镜像,那么作业应指向第一个镜像。 根据你的缩放设置,代理的可用数量可能不像你预期的那样多,因为有些代理被分配给了其他镜像。
  • 你在管道中使用 ImageVersionOverride 请求吗? 使用 ImageVersionOverride 需求指定与 池设置中配置的版本不同的映像版本时,每个代理都使用指定的映像版本按需启动。 备用代理是使用 池配置中指定的映像版本预配的。 如果使用 ImageVersionOverride,则任何备用代理都与该版本不匹配,并且会启动新的代理。
  • 您的代理、虚拟网络或防火墙设置是否减慢了池的速度? 任何网络设置的速度缓慢可能导致代理启动和连接到 Azure DevOps 所需的时间延长。
  • 是否要覆盖代理版本? 默认情况下,托管 DevOps 池在最新的 Azure DevOps 任务代理版本上运行。 管道 YAML(如 Agent.Version 需求)和 Azure DevOps 组织设置中的设置可以强制管道使用旧版任务代理,这需要在分配计算机后重新加载。