使用进程虚拟化构建“虚拟超级计算机”
构建和发布是一个复杂的过程。我真的不需要告诉任何人这一点……但我还是说了。但是,一个快速、精确的反馈循环,可以通知最新的软件构建是否成功通过,并且告诉你具体哪里失败,而不是仅仅是“操作失败”,这可能意味着能够快速修复缺陷,或者直到项目生命周期的后期才发现这些缺陷,从而成倍地增加修复它们的成本和难度。多年来,IncrediBuild 一直在通过 Microsoft TFS 解决这个问题,现在正在为 Linux 开发人员重新设计他们的工具。
据 IncrediBuild 的 CEO Eyal Maor 称,秘诀在于他们所谓的进程虚拟化。简而言之,进程虚拟化通过允许构建机器利用网络中所有机器的所有核心来帮助加速构建过程。Maor 表示,在大多数情况下,“周期可以从 20 分钟缩短到 2 分钟以下,而且还有更多的周期可用。”
对于 Linux Journal 的读者来说,也许最有趣的部分是它的工作原理。让我们从头开始。标准的构建过程通常分配一个单独的构建代理,它通常利用单个 CPU 核心来运行整个工作流程。大部分工作流程是顺序完成的,只有极少部分并行运行。这意味着,为了提高性能,必须提高构建代理的 CPU 速度以进行计算过程,以及提高 IO 密集型过程的 IO 能力,例如读写文件系统或网络。
由于摩尔定律在 2003 年左右基本上被“废除”了,因此仅仅投入更多硬件来解决与速度相关的性能问题的想法不再奏效。当然,使用多核机器是一个开始,但不能简单地拿一台双核机器,运行一个进程,并期望它能自动以与具有相同时钟速度的单核机器两倍的速度运行。双核 CPU 可以运行的运算次数是其单核同类产品的两倍,但它必须并行运行它们,一次运行两个,才能实现进程速度加倍的目标。因此,关键是将进程分解为独立的进程,并在单独的核心上运行每个进程,以实现多核优势。因此,至关重要的是,尽可能分解和并行化尽可能多的 CPU 密集型操作,以便最大限度地提高进程速度,而不是过度利用所有这些闪亮而昂贵的硬件。
因此,显然,操作需要并行完成,但并行处理的难点在于细节。请记住,如果通过更有效地使用多核 CPU 来提高速度是目标,那么注意力应集中在并行化 CPU 密集型操作,而不是 I/O 密集型操作。除此之外,还有几种可能的并行处理解决方案
- 集群 - 本质上是并行化构建过程工作流程级别,在每个代理上运行一个完整的工作流程,以便可以并行处理多个构建请求。
- HPC - 计算机(物理或虚拟)可以聚合计算能力,从而提供比单个台式计算机或工作站更高的性能。HPC 利用许多 CPU 核心来实现这一点。例如,基于 Ubuntu 的机器最多可以支持 256 个核心。
虽然这些解决方案中的任何一个都提供了加速流程的机会,但两者都有局限性和缺点。集群选项很快变得非常复杂,并且强制集群得到最佳利用也很昂贵且耗时。整个构建工作流程需要分解为多个工作流程,每个项目解决方案都需要单独的工作流程,运行每个测试等等。然后仍然需要同步每个此类工作流程的环境和输出,将源文件发送到每个编译工作流程,检索和组织编译结果,然后将它们发送到新的工作流程进行测试,并同步这些工作流程的结果。哦。还需要在每个参与的构建代理上设置所需的软件,因此并行化工作将受限于专用于构建过程的机器数量。正如我所提到的,这种对众多离散项目的并行化是复杂、昂贵、耗时且最终不划算的。
HPC 解决方案也有缺点。它受到可用核心数量的限制,在复杂的构建中,核心数量会很快耗尽。粒度也是一个问题。在不花费大量时间和精力修改软件编译方式的情况下,项目解决方案(或顶级项目)是原子的,并且无法并行构建。最后,系统本身的成本可能令人望而却步;通常是数万到数十万美元,许多公司无法承担这种类型的资本支出,然后将这些资产专门用于构建过程。
另一方面,IncrediBuild 通过允许构建机器利用网络中远程机器的空闲 CPU 周期(即使这些机器正在使用中),将任何构建机器转变为虚拟超级计算机。无需更改源代码,无需额外的硬件,无需专用集群,并且它可以在本地和 WAN 上工作,因此可以无限扩展到云端。它不会干扰远程机器上现有操作的正常性能,而是利用网络中任何核心上的空闲 CPU 周期。
IncrediBuild 可以集成到您现有的构建工作流程中,并通过替换默认编译器来加速您的构建引擎。激活后,它会拦截对编译器的调用,并将这些调用转移到远程机器上运行。IncrediBuild 确保远程执行器具有运行编译过程所需的一切,并且远程机器将编译结果发送回发起者(构建代理)。编译性能基准测试表明,IncrediBuild 能够将进程加速至少 8 倍以上。这种速度是通过进程虚拟化实现的。
进程虚拟化由两个参与者组成——发起者机器和辅助机器。发起者在网络上分发计算过程,就好像远程机器的核心是它自己的核心一样,而在辅助机器(远程机器)上执行的过程看到的是发起者的文件系统和注册表,而不是辅助机器自己的。进程虚拟化基于以下概念:本地拦截执行进程的请求、将这些进程委托给远程执行、拦截远程执行进程执行的文件系统请求、按需将这些资源从发起机器同步到辅助机器,以及将远程进程文件系统调用重定向到从发起机器同步和缓存的文件。
当 IncrediBuild 设置为编译项目时,它会激活默认的编译工具。当编译器尝试创建编译进程时(例如,使用 csc.exe 编译 C#),它会拦截对操作系统的调用,并将请求以及必要的输入(编译器可执行文件、源代码和环境设置)发送到空闲的远程辅助核心以进行执行。此信息被压缩和缓存,以便优化和减少发起者和辅助机器之间的网络流量。这样做的目的是远程执行预期计算量大的进程。
收到进程后,辅助机器(远程机器)开始使用从发起者收到的参数执行它。辅助机器从发起者检索它需要的任何文件系统或注册表资源(以及缓存中缺少的资源),以便完成进程。这是通过拦截任何 I/O 或机器特定信息,并将请求转发回发起者来完成的。通过这种方式,辅助机器可以访问发起者的注册表、文件系统和其他机器特定信息。辅助机器的核心实际上变成了发起机器的核心。
最后,当计算完成时,输出,即远程运行进程的编译结果,将返回给发起者,并在那里存储,就好像它是在该机器上运行的一样(任何 StdOut、StdErr 等也会被传输)。通过这种方式,每个耗时的 CPU 密集型进程都被委托给另一台机器,从而允许整个网络同时处理它们,而不是让一个 CPU 顺序运行它们。所有这一切的实现都没有改变软件的编写方式,无需在远程机器上安装任何东西,也没有改变构建工作流程的运行方式。
IncrediBuild 是 Xoreax Software 的产品,该公司于 2002 年推出,此后已成为代码构建加速的事实标准解决方案。如今,它拥有超过 100,000 名用户,遍布 200 多家公司,他们依赖它来实现应用程序和构建加速。Linux 版本将于 8 月 17 日在西雅图的 LinuxCon 上发布。