什么是进程虚拟化?
Incredibuild 通过将进程并行分布到安装有 Incredibuild 的本地网络机器的空闲内核来加速耗时产品或执行。例如,Incredibuild 使运行在四核本地机器上的执行能够在网络中的 400 个内核上运行,从而显著加快整体执行时间。
Incredibuild 使用一项独特技术来加速这些进程和应用程序:Process Virtualization。该项技术将远端机器上的进程虚拟化,就像他们在本地机器上运行一样。
注意: Process Virtualization 与 VMware 类似。VMware 在一个为此目的而提前设置的完整远程计算机虚拟化进程,而 Process Virtualization 在远端机器上按需运行进程。
Process Virtualization 技术可确保所执行的任务与启动作业(启动机器)的计算机上执行的任务完全相同,而与远程 Agent 的文件系统、安装基础和环境无关。
Process Virtualization 不要求在远程 Agent 上安装,也不要求从启动机器复制任何文件。唯一的要求是在所有机器上安装小而轻的 Incredibuild agent。Process Virtualization 确保远端机器所需的文件(包括 DLL 等)自动透明地从启动机器转至 Helper 机器。
Process Virtualization 提供了一个附加功能 – 拦截,此功能可在本地机器上实现。如果父进程必须运行很多子进程,且希望在远端机器上运行这些子进程,Incredibuild 知道如何侦听父进程的所有进程执行。借助于一个定义应在远程运行的进程的小 XML 文件,IncredBuild 知道如何监视父进程的所有进程创建,并且针对它创建的每个进程,查看预定义的 XML 文件,以查看用户是否已定义要远程运行的进程。
Process Virtualization 技术适用于所有 Incredibuild 解决方案(VS、Make and Build Tools、Dev Tools),它们之间只有很小的区别:
- 除了 Process Virtualization 技术外,Visual Studio 还以插件的形式对 VS 进行了优化,并增加了对 VS 编译进行优化的功能。
- 对于 Make and Build Tools,Incredibuild 创建了一个已证明有效的配置文件,并添加了技术来处理 Make 中常见的问题。
- 对于 Dev 工具,使用了相同的技术,但是,用户可使用 IB 接口进行集成。
远程虚拟化环境
Helper agent 是网络中各种机器上的客户端程序,它们在虚拟环境中运行已执行作业的部分(任务),因此结果与在本地机器上运行任务的结果相同。Helper agent 与 Coordinator 通信,报告其资源(内核)的可用性。因此,Coordinator 始终了解每个 Helper agent 能够提供多少处理能力。
注意: Incredibuild 在 Helper 计算机上运行,但是不会影响计算机用户,因为它仅占用空闲 CPU 周期。用户不会知道 Incredibuild 在其计算机上运行,也不会收起干扰,因为用户获得了他们所需的资源,而 Incredibuild 仅使用计算机的可用资源。
当通过 Incredibuild 分配任务在 Helper agnet 上执行时,代表该任务的进程在特殊虚拟化环境中的 Helper 机器上运行。由此进程运行的任何子进程也都是虚拟进程。
Incredibuild 完全模拟了 Helper agent 的启动机器环境,包括:文件系统、注册表、进程 DLL、标准输出和目录信息。所有远程执行的任务都在此封装环境中运行。无需从原机器复制文件或在远端机器上安装应用程序。Incredibuild 支持网络上所有基于 Windows 的 agent 之间的交互,即使它们运行的是不同版本的 Windows 操作系统。
虚拟化处理数据流
Helper 执行进程并用虚拟化环境包围它,模拟原始机器的环境。在 Helper 机器中,进程对操作系统的每次调用都会被虚拟化环境拦截。如果调用与文件系统相关,则虚拟化环境会将文件从启动机器同步到远端机器,病将其缓存在一个专用文件夹中。然后,虚拟环境将原始路径(例如,c:\a.txt)替换为缓存路径(例如,c:\Incredibuild\cache\a.txt)。同样的逻辑也适用于注册表访问、DLL 加载等。
进程结束时,Initiator 机器将 agent 恢复为可用状态,并决定是否在其上运行另一个任务,或是否将其释放给 Coordinator。
对于在启动机器上运行的主软件(例如,Visual Studio),整个进程都是完全透明的(即:看起来好像该进程是由本地操作系统处理的)。在 Helper 机器中,任务由操作系统上的 Incredibuild 作为虚拟化进程处理。
如果传统用户也在使用 Helper 机器,则附加(IB 启动的)处理对于用户而言并不明显。大多数情况下,计算机只使用很少的 CPU 能力。Incredibuild 充分利用了组织中计算机无法持续使用的大部分可用 CPU 时间。Helper 机器上执行的远程(虚拟化)进程仅使用机器的空闲 CPU 周期。在一个中等规模的组织中,这意味着在任何给定的时刻,Incredibuild 都可以使用数百个未使用的内核来加速组织中的进程。组织中每个可以启动进程的工作站都可以作为一个具有 200 个内核的工作站,而不是只有 8 或 16 个内核。
由于 Helper 机器没有任何与完成任务相关的资源(例如,文件或 DLL),因此 Incredibuild Agent 在 Helper 上运行进程,并用虚拟环境将其包围,在其处理任务时向 Initiator 请求所需的资源。这些资源存储在 Helper 的 Incredibuild 文件缓存中,这样下次在虚拟环境中运行进程时,Helper 就可以使用先前存储在其缓存中的资源(假定自上次执行后这些资源未作修改)。
Incredibuild 有一组简单的界面,使您可以直接要求在远程 Helper 上运行命令,或者预先定义进程名称,一旦检测到,Incredibuild 会自动在远程计算机上运行,前提是有可用的计算机。
例如,当 Incredibuild 在 Visual Studio 中加速构建时,它会将 cl.exe 进程、Visual Studio 的 compliler 和 C++ 添加至待虚拟化的预定义进程名称列中。这样,每次 Visual Studio 运行 cl.exe 进程时,Incredibuild 就会自动在远程计算机上运行此进程。请参阅自动拦截界面。
如果您运行一个批处理文件,而该文件又会运行许多测试进程,您可以指定在批处理文件中运行的所有进程都在远端机器上并行运行。请参阅提交界面。