选择理想的接口
指南:如何选择理想的接口
Incredibuild 接口是一种用于指导 Incredibuild 如何与您的软件或脚本文件集成的工具。借助 Incredibuild,您即可在安装了 Incredibuild Agent 的机器上,利用您网络中全部现有核心并行执行多种任务,进而提升软件性能。
Incredibuild 接口具有以下用途:
-
(强制)与自定义软件集成,即用于 Incredibuild for DevTools 解决方案。此用途要求您必须使用一个或多个由 Incredibuild 提供的接口。
-
(可选)进一步扩展和提升 Visual Studio 以及 Make and Build Tools 解决方案。(请参阅 Accelerating Custom Build Steps, Custom Build Events and Custom Build Tools in Visual Studio 中的相关部分。示例: 作为构建的一部分,如果您在 Make 和 Build 工具中执行了大量文件渲染,那么您还可以加速作为该构建一部分的渲染过程。
确定使用哪种最适合的接口之前,针对您想让 Incredibuild 加速的任务执行,您还需要了解以下方面:
-
该任务是串行的、并行的还是两种特征兼有的?
-
该任务是否能够使用多个本地核心?
-
该任务是否能够执行多个进程?
-
该任务是否包含命令行接口?
在您熟悉了三种接口选项并理解了这些选项如何应用于您的应用程序之后,您即可仅针对您写入的脚本和工具进行更改,以便任务能够并行运行。
对于第三方工具,您可以借助 Incredibuild 尝试在网络中全部现有核心上强制并行运行其中多个任务,而非只能在本地核心上运行任务,进而显著提升性能。如果第三方工具中包含了允许您并行运行多个命令的命令行,以上操作也同样有效。
对于第三方工具,您可以利用 Incredibuild 在网络中全部现有核心上强制并行运行尽可能多的任务,而不是只能在本地机器上运行任务。
注意:Incredibuild 不具备分配线程的能力。Incredibuild 能够分发的最小单元是 Task(OS 级进程)。通常,多线程应用程序经过轻松转换,可具备多进程功能,从而受益于 Incredibuild 的分发技术。以上仅对您自有应用程序有效,对第三方应用程序无效。
以下部分是对接口的详细描述,将引导您进行此类决策并以最佳方式使用接口。
Automatic Interception Interface
如今,越来越多的软件应用程序利用本地机器的多核心/处理器优势,具备了支持并行执行多进程操作模式的能力。利用 Automatic Interception Interfaces,可加速执行这些并行进程,而无需对源代码进行任何更改。通过 Automatic Interception Interfaces,Incredibuild 会收到一份进程类型(名称)列表,以及一个有关如何执行每种进程的描述。
示例:某个名为“MyApp.exe”的应用程序, 可根据您计算机上的核心数量,确定要对“DoSomething.exe”进程采取并行执行操作。也就是说,如果您的计算机上有 4 个核心,Myapp 就会在每次执行中运行 4 个 DoSomething.exe 实例。让 MyApp 了解您的计算机上具有大量核心(例如 200 个),即可显著提升 Incredibuild 中此应用程序的执行速度,进而将 200 个 DoSomething.exe 的任务发送至 Incredibuild 队列。通过这种方式,Interception Interface 将不仅限于使用本地核心,而是在网络中各个核心的基础上,对余下全部 196 个 DoSomething.exe 任务进行自动分发。
以下步骤应在 Incredibuild 中予以执行,以显著缩短总执行时间:
-
写入一个小型 XML 文件,其中需要描述哪些进程类型/名称应在远端运行,以及哪些进程类型属于负责执行子进程的调用者。(在本例中,MyApp.exe 属于调用/生成进程,而 DoSomething.exe 则属于应由 Incredibuild 在远端核心上运行的进程。
-
指示 MyApp.exe 并行运行大量 DoSomething.exe 任务,而非仅运行与本地核心数量相等的任务。该数量应不小于能够在您的网络中并行运行的最大任务量。此外,您也可以指定一个比可并行运行任务量更大的数量(大很多都可以),例如 1000 个任务,即便网络中并没有那么多核心。通过这种方式,Incredibuild 即可根据可用核心数量,了解如何执行全部 1000 个请求,以及如何管理队列本身。
-
使用 Incredibuild IBConsole 命令执行 MyApp.exe,并且应在该命令的命令行中对允许的并行进程数量进行定义。此 IBConsole 命令将激活整个作业。MyApp.exe 并行执行的任务数量越多,Incredibuild 的加速效果就越好。
Incredibuild 将引用 XML 文件以查看如何执行 Job 中的每个 Task。在 Incredibuild 中(定义为调用者)运行 MyApp 时,Incredibuild 会侦听 MyApp 对操作系统所做的所有调用。每当 Incredibuild 发现 MyApp 调用了一个进程时,Incredibuild 都会检查该进程名称是否出现在 XML 文件(创建于上述步骤 1)中,并判断该进程是应于远端运行的进程,还是负责生成进程的调用者进程。如果确定该进程应于远端运行,那么 Incredibuild 就会在远端计算机而非本地计算机上运行它。请注意,如果本地核心可用,Incredibuild 也可以在本地计算机上运行 XML 文件中被定义为应远端运行的 Task。
AllowIntercept 功能将标记用于生成子进程的调用者进程。例如,如果某单一进程“a”执行了某单一进程“b”,“b”又执行了“c”,则“a”与“b”均将声明为“AllowIntercept”,同时“c”将声明为“AllowRemote”。
-
并非所有进程都需要在 Profile.xml 文件中进行定义。当调用者执行了未在 Profile.xml 中定义的进程时,Incredibuild 将会在本地运行这些进程。
-
除了准备就绪(请参见上述步骤 1)的 Profile.xml 文件中所要求的 Allow Intercept(调用者)和 Allow Remote(用于远端运行)标志,还可将其他标志分配至进程。更多详情请参阅 Profile XML。
-
与所有 Incredibuild 接口一样,所有远端执行任务均完全模拟发起机器的环境及文件系统,免去了在远端机器上复制文件或安装应用程序的需求。对 MyApp 而言,不论在远端还是本地运行进程,均无任何差别。
优势与缺陷:
该接口的优势如下:
-
如果您想要加速的应用程序(无论是您写入的应用程序还是第三方应用程序)已经能够并行执行多个进程,那么就无需对应用程序源代码做任何更改,以便利用 Incredibuild 加速应用程序。
-
应用程序将并行执行尽可能多的进程,并允许由 Incredibuild 管理执行队列,同时还将根据网络或本地机器中的可用核心数量进行进程分发。
此外,该接口的缺陷是,如果第三方应用程序不支持多处理,则进程将会顺序运行,同时 Incredibuild 也不会了解应如何并行运行这些进程。如果不是第三方应用程序,并且其源代码也可以修改,那么您即可通过更改源代码,让 Incredibuild 了解如何并行运行进程。
注意:如果第三方应用程序仅能够顺序运行任务,并且其源代码不可修改,那么您可以查看一下该应用程序是否具备命令行。如果有,那么您即可写入多个用于并行运行的命令行,而不用每次都要顺序运行应用程序任务。在这种情况下,建议使用 Submission Interface。
如符合以下条件,建议使用此 Interface:
-
您运行的第三方工具或应用程序正在并行执行多个进程。
-
您运行的自有自定义工具可支持并行执行进程(或经修改后可支持),并且您想要通过网络分发加速进程。
Submission Interface
Submission Interface 允许直接提交 Task,以便 Incredibuild 进行分布式执行。该 Interface 支持从批处理文件、脚本和自定义工具处进行轻松分发。此外,还可以在更高级别使用该 Interface,例如在远端机器上并行执行各命令行或进程。通过使用此 Interface,对原始命令行的调用替换为对 xgSubmit.exe 的调用,同时原始命令行将作为输入被接受。每次调用 xgSubmit.exe 时,指定命令行均会进行排队,用于分布式执行以及并行执行。可以从脚本处调用 xgWait.exe 以便暂停执行,直至指定任务组完成执行(允许并行任务组之间存在依赖项)。最后,使用 IBConsole.exe 对脚本/工具本身进行调用。与所有 Incredibuild 接口一样,所有远端执行任务均完全模拟发起机器的环境及文件系统,免去了在远端机器上复制文件或安装应用程序的需求。
优势与不足
该方法仅特别适用于运行来自脚本内的任务,例如批处理文件。使用 Submission Interface 无需对现有代码进行重大更改,并且,如果您想要完全控制对同类进程的执行(有时本地有时远端,取决于具体场景),此方法将非常适合。然而,细微更改是需要的,并且如果应用程序或脚本具有数千个任务,那么执行这些任务时将会非常繁琐。如果您对于哪些类型的进程将由 Incredibuild 在本地执行、哪些在远端执行没有特别要求,那么“Automatic Interception”接口将会是最适合您的选择。
其优势包括:
-
可与任何脚本或工具简单集成。
-
可在本地或远端执行进程,具体由用户决定。
-
命令文件支持快速高效地提交大型命令集。
如果您有以下需求,建议使用此接口:
-
通过 Make 工具加速构建运行,且此类工具不支持在本地并行执行任务(例如 Microsoft NMAKE)。
-
分发通过批处理文件或脚本运行的进程。
-
分发通过自定义应用程序运行的进程,并且,比起创建 XML 文件(内含对即将分发的任务的描述)或通过自定义工具支持在本地并行执行任务,更倾向于使用直接的 Submission Interface。
XML Interface
XML Interface 是一种通用分发接口,它使用了输入 XML 文件(文件中描述了一组即将由 Incredibuild 引擎执行的命令行任务),以及这些任务的输入文件、输出文件和依赖项。
此接口用于执行 XML 文件中定义的复杂进程。使用此接口,您可以构建需要加速的软件主进程。XML 文件将作为脚本管理进程的执行,指示 Incredibuild 如何运行进程。
IBConsole 会借助 XML 文件来启动进程,并且在使用该文件时,会将其作为有关如何分发任务的输入。与所有 Incredibuild 接口一样,所有远端执行任务均完全模拟发起机器的环境及文件系统,免去了在远端机器上复制文件或安装应用程序的需求。
每个 Incredibuild Project 的适用 XML 语法均描述了该 Project 的任务以及任务间所存在的依赖项。
在其他接口中,对脚本的执行由 IBConsole 命令管理。示例:
xgConsole myjob.xml
此接口的优势在于,Incredibuild 能够在管理作业执行的同时,让您完全控制执行流程(任务和依赖项)。
优势:
-
完全通用且自治
-
支持复杂任务和文件依赖项
-
支持完全重建、增量构建和清理操作
-
支持文件搜索和响应文件加载
-
支持 Environment Variable 读写访问
如符合以下条件,建议使用此 Interface:
-
您希望将现有执行脚本/构建工具替换为 Incredibuild 基于 XML 的构建系统,以便分发进程。
-
您想要分发顺序运行的进程执行(该进程运行于自定义应用程序),并且能够描述将要以 XML 格式分发的命令集。
-
您想要分发相同命令行的执行,(该命令行运行于一组由通配符表达式描述的文件),例如运行命令行“analyze.exe /out:./TargetDir " on all files matching the expression "MyFolder\*.cpp”)。
注意:当年将 Incredibuild 用于 DevTools 时,您必须在以上三种集成接口中,选择一种使用,您也可以选择使用接口组合。使用前,您必须先使用 IBConsole 命令来执行 Incredibuild 引擎本身,并激活您选择的接口。更多使用详情,请参阅 IB Console Command Reference章节