设置云spot实例,利用 Incredibuild 构建 C++ 项目

Blog
Author:
Joseph SibonyJoseph Sibony
Published On:
3月 16, 2022
Estimated reading time:
1 minute

在上一篇文章中,我们学习了 AWS 上设置 Incredibuild 构建系统的方法。

我们了解了 EC2 helper 机器(一个由两台机器组成的小型集群——initiator 与 helper)加快编译速度的使用方法。

如果您需要额外计算能力,无论是 AWS EC2 还是本地计算机,都可以添加更多机器。但如果我们仅在有限时间内需要这些计算资源呢?如果仅使用云 EC2 实例,那么可在不需要时终止它们,但这需要手动处理或额外脚本对 f 进行管理(当然,因为编写与维护的需要,这些脚本不是免费的)。

在这篇文章中,我们将了解 Incredibuild for Cloud 的使用方法,运用spot实例,用最小的成本取得灵活性与低廉的价格。这有助于我们提高成本效益与灵活性。我们动态使用构建所需的云实例数,而不是管理 EC2 机器,如此便无需手动启动和终止机器(或通过管理脚本实现)。

竞价实例是一个备用 AWS 机器(类似 EC2,但不是作为我们“自己”的机器接受分配)。关于spot实例,以下是 AWS 的简要描述,如果您熟悉竞价实例,请跳过本部分:

竞价实例是指使用闲置 EC2 容量的实例,其价格低于按需分配的价格。因为有了竞价实例,您能以极大折扣申请未使用的 EC2 实例,大大降低亚马逊 EC2 成本。竞价实例的时价称为竞价价格。每个可用区中,每种实例类型的竞价价格由亚马逊 EC2 设定,并根据竞价实例的长期供应与需求逐步调整。只要有容量,并且您申请的最高时价超过竞价价格,您的竞价实例便可运行。

如果您能灵活掌握应用程序的运行时间及中断情况,竞价实例不失为一种具有成本效益的选择。例如,竞价实例极其适合数据分析、批处理、后台处理与可选任务。欲了解更多信息,请参阅亚马逊 EC2 竞价实例

因此,使用竞价实例构建是降低云成本的简单方法。但折扣并不免费——存在中断可能。如果 AWS 对计算力有高需求(即有人要求将这些机器作为常规 EC2 使用),那么可以向公司索要该机器。每种类型的竞价机器都有自己的中断率,中断频次越高,每台机器的价格就越低,请参阅下述 AWS 竞价实例顾问用户界面中的“中断频率”)。

您可前往 AWS 竞价实例顾问页面,查看相关数据的实时情况,并比较机器的中断率和价格节省情况。请注意,上述内容随时间与地区变更。此外,请记住,相较于按需报价,只要迁移至spot实例,您就能在云账单上平均节省多达 40% 或更多。

那么如何利用竞价实例进行构建呢?

我们已经使用了安装在网络上的 Incredibuild,并了解了它通过分配进程给网络上其他机器来构建的方法。在之前的文章中,我们使用了一个 EC2 helper 机器和一个 initiator。借助 initiator 启动编译,并使用另一个 EC2 作为 helper 机器。

分布式构建的想法是使用可并行化加快进程的 helper 机器(除编译之外,可能还包括静态代码分析、测试等任务),方法是分配这些部分任务给 helper 机器。

我们可以在网络上设置本地计算机作为辅助器,也可使用 AWS、Azure 与谷歌云等供应商提供的云机器。

在之前的文章中,我们使用了分配好的 EC2 实例。而在本篇文章中,我们迁移至 AWS spot实例,但更希望不处理管理spot实例带来的全部问题,并避免管理中断(即在构建过程中从我们这里取走的竞价实例)。使用 Incredibuild Cloud 可实现这一目的。

来聊聊竞价吧!

好消息是 Incredibuild for Cloud 将负责spot实例管理。我们仅需配置环境,即可让 Incredibuild for Cloud 及 AWS 竞价实例施展魔法,动态分配所需资源直至构建完成。一经完成,全部资源将终止。

它还具备当前 AWS 基础设施不支持的功能——每当从我们这里取走竞价实例时,它都会启动回退机器。Incredibuild 将自动启动回退机器(稍后可在本博客中了解其选择方法)。因此,即使竞价实例中断,最终 Incredibuild for Cloud 也可确保编译任务成功完成,并产生预期输出。

我们不会过多研究回退机制底层工作的全部技术细节。但为了理解其内在魔法,我们应该注意到迁移至竞价实例并不足以实现其连续性。通过捕获中断机器的状态、克隆并复制到全新竞价实例,使用激活状态的全部相关人工制品、缓存与内存,Incredibuild for Cloud 可确保启动后的全新竞价实例处于活跃状态,从而完成平稳过渡和移交。

由此便无需使用 EC2 实例作为辅助器(除非我们有一个预先分配用于其他用途的 EC2 机器,而它现在是闲置的,那么我们便可将这样的机器放置于群组中)。

配置 Incredibuild Cloud

Incredibuild for Cloud 是管理云机器的服务。以下是设置 Incredibuild for Cloud 所需的说明。请注意,在某些步骤中可能需要 AWS 管理员的帮助。

详细步骤

1.在 initiator 控制台上,运行以下脚本启用云:

/opt/incredibuild/management/enable_cloud.sh

2.如果您正在使用 EC2 作为 initiator,需为 EC2 机器本地主机加设 8080 及 8081 端口:

 

3.现在需要访问 Incredibuild 的网络 GUI,该界面在您的计算机上本地运行。进入 Incredibuild 的网络 GUI,在您的本地主机上访问:

 http://127.0.0.1:8080/incredibuild/

您应在浏览器中看到以下内容:

4.点击协调监视器选项卡,如上图所示。

5.现在,按下“添加 Cloud Cores”按钮:

确保允许弹出窗口。

1.现在,必须注册 Incredibild for Cloud 免费试用(除非已经注册,或者您持有许可证):

1.必须选择云服务供应商,在演示中,这将是 AWS:

1.免费试用要求使用电子邮箱创建登录,然后点击“注册”:

连接 AWS 账号

为了让 Incredibuild for Cloud 代表您的 AWS 账户管理spot实例,您必须将 Incredibuild for Cloud 关联到一个特定 AWS 角色,并确保其拥有该过程所需的最低权限。请注意,该构建将在您的 AWS 账户上运行,所以您仍需支付所使用的 AWS 云实例费用。

1.下面的步骤,即创建 AWS 角色,通常会由你的 IT 管理员执行。按照这些说明,设置适当的角色 ARN (“亚马逊资源名称”),并使用任意独特字符串作为您的外部 ID (任意字符串作为外部 ID 均可,之后该字符串将被用于连接 Incredibuild for Cloud 到您的 ARN 角色)。完成后,便可继续进行 Incredibuild 的cloud GUI 设置。

1.一旦点击“注册”按钮(步骤 8),页面将提示您填写以下表格,需要填写您在步骤 9 中创建的证书。

点击“继续”并设置您的云偏好:

1.一旦输入证书,下一步,您将在以下表格中设置spot实例机器池,我们将在下面详细审查。

1.在第一部分,输入名称和注册 Incredibuild 许可证时使用的同一个电子邮件。

1.在“资源管理”部分,您可能想要选择与在使用 AWS 时的同一个“云区域”:

选择机器

1.现在,需要选择想要使用的机器:

该演示中,需要选择最小可用机器:c4.large – 2 Cores, 4GB RAM。可以看到,即使使用最小机器    (也是最便宜的),仍然可以获得显著加速效果。但是,对于更大型项目,建议您考虑 c5 机器。

此外,确保切换“使用spot实例?”为使用状态:

因为这将使用竞价实例作为 helper 机器。选择适当的机器类型,您可能想要使用本文章之前提及的 AWS 竞价顾问。此外,您可能想要比较竞价实例按需定价之间的价格差异。

设置新spot实例池的最大内核数和池中机器数。
如欲了解更多细节,请参阅:https://docs.incredibuild.cn/cloud/cloud_settings.html

请注意,AWS 没有回退机制。但如上所述,Incredibuild 已经为我们开发了回退机制!

如上所述,您可在此对话框中选择回退机器:

值得注意的是,尽管回退机制对spot实例更为关键,但对按需机器也很重要。在按需机器出现故障的情况下,它也会启动,主要是由于网络问题(这在云实例中相当罕见,但仍然可能发生)。当然,如果您需要更多按需机器,但在预先分配的集群中没有足够容量,Incredibuild for Cloud 将使用spot实例,实现您构建所需的容量。

2.快要完成了!请点击表格下方的“保存”按钮”,紧接着会提示的条款,请接受:

完成!准备好运行第一个构建了。

运行构建

搭建好构建环境,便可运行分布式构建了。

在本案例中,initiator 驻留在一个 EC2 分配机器上,我们还有另外四个空闲 EC2,可作为构建的辅助器。initiator 将找到我们的常规 EC2 和 EC2 spot实例,并将它们全部用于构建。spot实例由 initiator 根据我们上面执行的指示来定位。安装 Incredibuild 辅助器时,我们允许其与 initiator 连接,这说明 EC2 是由 initiator 找到的。

现在,可以从控制台用以下命令启动构建,在 initiator 机器上使用 Make:

或者 Ninja:

然后就可以了!

可以看到,构建群组由spot实例和常规 EC2 组成,达到了我们所要求的内核总数。

在我们的演示中,目前的构建比不使用额外spot实例快 22%,比仅在我们的 initiator 上运行快 77%。这一结果当然取决于实际使用的机器类型,以及在本案例中使用的最便宜的spot实例。

不用说,如果我们仅使用spot实例,而没有任何现有闲置 EC2,就需要允许更多的spot实例/更大型机器来实现同样显著的构建加速,而不需要预先分配的 helper 机器。

结束语

我们介绍了与 AWS 一起配置 Incredibuild for Cloud,以及实现构建spot实例自动化的方法,而不需要管理启动和终止以及顾虑spot中断。

如果您正在使用 Azure 或 GCP,Incredibuild for Cloud 也可让您以极其类似的方式利用您的云资源,保持构建分布的透明度。

使用 Incredibuild for Cloud 的spot实例是一个惊人的工具,可按需加速你的构建。仅需付出极少的成本,几乎零维护,便可将成本效益及开发速度提升至全新高度。