提高TestStand系统性能 【8】
概览
本文讨论了对使用NI TestStand软件开发的测试站进行性能优化的最佳实践。请务必谨记,任何解决方案都不可能完美无瑕,很难做到适用于所有测试系统。有些方法在某些测试系统中会降低性能,而在另一些测试系统中则能提高性能。在对系统实施任何更改之前和之后,请抽出时间对测试结果进行基准测试,以此评估系统的潜在优缺点。
内容
- TestStand配置选项
- 提高序列文件加载性能
- 提高代码模块性能
- 通过并行测试提高测试性能
- 优化硬件使用情况
- 优化结果处理
TestStand配置选项
TestStand具有多个配置选项,这些选项可能会影响性能。以下各节介绍了这些选项。
- 序列跟踪
- 平衡执行速度和内存使用情况的方案
序列跟踪
序列跟踪可提供当前操作的即时反馈和状态,例如“合格”(Pass)、“失败”(Fail)、“错误”(Error)或“跳过”(Skipped)。但序列跟踪会降低执行速度,从而影响性能。以下方法有助于提高执行速度,而且不会影响序列跟踪带来的好处。
为了在启用序列跟踪后提高性能,请将跟踪速度设置为快速,确保步骤之间不存在额外延迟。依次打开“配置”(Configure)»“测试站选项”(Station Options),使用“测试站选项”(Station Options)对话框的“执行”(Execution)选项卡对跟踪进行配置。
即使设置为最快速度,跟踪也会在每个步骤执行后花费几毫秒的时间来更新“执行视图”(Execution View)窗格。为了获得最快性能,可完全禁用跟踪。不过,如果禁用序列跟踪,则执行视图不会在执行序列时更新。
要在获得跟踪优势的同时平衡性能,请使用“序列调用跟踪设置”(Sequence call trace setting)禁用特定子序列中的跟踪。 要使用此方法,请将测试进行逻辑分组,并为每个组创建子序列。 例如,在针对移动设备的测试序列中,每个组件(例如蜂窝数据、用户输入和音频系统)的测试都可以在单独的序列中实现。对于每个组件的SequenceCall步骤,请在序列调用中禁用跟踪。
- 选择“属性”(Properties)»“运行选项”(Run Options)
- 将“序列调用跟踪设置”(Sequence Call Trace Setting)属性设置为“在序列中禁用跟踪”(Disable tracing in sequence)
通过这种方法组织测试序列,可对顶层序列使用序列跟踪,而不会因为跟踪每个子步骤而导致性能下降。由于可以异步调用每个子序列,因此这个方法也可以方便地应用到并行测试。关于并行测试序列的更多信息,请参阅通过并行测试提高测试性能。
使用禁用跟踪的序列调用步骤来提高性能并查看执行状态
平衡执行速度和内存使用情况的方案
借助TestStand,可配置何时将代码模块加载到内存或从内存中卸载,这可能会对测试序列的内存使用情况和执行速度产生重大影响。如果将模块配置为在内存中保留更长的时间,则将缩短执行时间,因为在子序列执行时无需重新加载模块。 不过,如果内存中保留了太多模块,则可能会超出应用程序内存限制或可用的物理内存,这也会减慢执行速度。
理想情况下,可以对测试系统进行改进,增加内存限制,而不是卸载代码模块以节省内存。例如:
- 使用64位版本的TestStand,增加应用程序的内存限制。如需了解更多有关使用64位TestStand解决内存问题的信息,请查看如何选择32位TestStand和64位TestStand帮助主题
- 向测试系统添加其他物理内存。
- 使用固态硬盘提高虚拟内存性能。
如果内存使用情况方面仍然存在问题,可以在步骤级别或序列文件级别设置“加载/卸载”(Load/Unload)选项。在大多数测试系统中,可将“打开序列文件时预加载”(Preload when opening sequence file)或“执行开始时预加载”(Preload when execution begins)选项与“序列文件关闭时卸载”(Unload when sequence file is closed)选项结合使用,从而实现卓越性能。
目标 | 理想设置 |
最大化执行次数 | 使用“打开序列文件时预加载”(Preload when opening sequence file)和“序列文件关闭时卸载”(Unload when sequence file is closed),将模块保留在内存中,直到序列关闭。 如果在内存中始终加载模块,可以提高后续调用的速度。 |
减少内存使用 | 使用“动态加载”(Load Dynamically)和“执行步骤后卸载”(Unload after Step Executes),以便在不再使用模块时从内存中删除模块。但是,由于每次执行步骤时都必须重新加载模块,因此性能会有所降低。此设置还有其他风险,例如在卸载一个代码模块时可能会丢失该代码模块中的全局数据。 |
提高序列文件加载性能
文件格式
加载较大的序列文件时,文件格式可能会影响速度和性能。借助TestStand,用户能以下列文件格式保存序列:INI、XML和二进制文件格式。
- 仅当必须能在应用程序中查看文件且无法访问TestStand引擎时,才能使用XML,例如使用“序列文件查看器”工具或其他自定义查看器。
- 只有在序列文件必须与TestStand 3.x或更早版本兼容时才使用INI格式。
- 如果上述两种方法均不适用,请使用二进制格式以获得最快的加载时间。
要指定用于新序列文件的格式,请执行以下操作:
- 选择“配置”(Configure)»“测试站选项”(Station Options)
- 在“文件”(File)选项卡中,选择“文件格式选项”(File Format Options)按钮。
要更改现有序列文件的格式,请执行以下操作:
- 选择“编辑”(Edit)»“序列文件属性”(Sequence File Properties)
- 在“常规”(General)选项卡上选择“文件格式”(File Format)。
- 在“新文件的文件格式”(File Format for New Files)菜单中选择希望保存的格式。
使用二进制文件格式获得最快的序列文件加载时间
搜索目录配置
用相对路径指定序列文件和代码模块时,搜索目录配置会直接影响加载序列文件和代码模块所需的时间。搜索目录配置会影响初始加载和测试执行的性能,以及动态加载模块的后续迭代性能。可使用搜索目录配置对话框来查看和编辑搜索目录。选择“配置”(Configure)»“搜索目录”(Search Directories),打开“编辑搜索目录”(Edit Search Directories)对话框。
解析代码模块相对路径时,TestStand会遵循以下过程:
- 将代码模块路径添加到第一个搜索目录。
- 检查磁盘上是否存在绝对文件路径。
- 如果确实存在,则解析路径。
- 如果不存在,则移至下一个目录。
TestStand会检查搜索目录列表,解析代码模块文件的相对路径
由于每个搜索目录仅计算一个路径,因此该过程通常不会对性能造成显著影响。
但是,如果搜索目录具有“搜索子目录”(Search Subdirectories)选项,则会对指定路径内的每个子目录重复该过程。 如果路径包含较大的目录层次结构,则此选项会严重影响性能。 此外,如果层次结构中存在多个名称相同的文件,加载的文件可能有误。鉴于这些原因,应避免对添加的任何搜索目录使用此选项。 请确保使用基本搜索目录的相对路径指定所有代码模块路径。
要进一步优化搜索目录的顺序,请遵循以下准则:
- 将包含大多数代码模块的目录置于列表的前半部分,将不常用的目录放在底部。
- 由于网络访问比本地磁盘访问速度慢,因此网络驱动器上的目录应置于列表的下半部分。
- 如果确实需要使用“搜索子目录”(Search Subdirectories)选项,请将这些目录放在列表最底部,仅作记录。
在为测试系统设计目录结构时,请考虑将代码模块保存到序列文件路径下的目录或特定的代码模块位置。
- 如果使用序列文件的相对路径,可确保第一个搜索路径(当前序列文件目录)始终返回正确的文件,并避免进行其他搜索。这种方法也能将整个文件夹移动到其他位置或计算机,而不必更改搜索目录。对于仅由单个序列文件或一组相关序列文件使用的代码模块,请使用此方法。
- 如果使用特定的代码模块位置,可将位置添加到搜索目录列表,从而轻松引用不同序列文件中的代码模块。 此方法适用于由许多序列文件共享的代码模块。
提高代码模块性能
TestStand可以在各种开发环境中调用代码模块,从而执行测试步骤。这些代码模块的配置和开发环境可能会对性能产生很大影响。 在任何代码模块环境中,都可以仅将必要的数据传入和传出代码模块,以此获得更好的性能。应避免传递代码模块不会访问或修改的大量数据。
编译代码模块(DLL)
在使用DLL的调试版(而非发布版)时,诸如.NET程序集或C/C++ DLL之类的编译代码模块可能会降低性能。通常,开发人员会在开发中使用调试DLL,以便更轻松地查找和纠正模块中的问题。准备好部署测试序列后,请切换到发布版DLL,以提高性能。
LabVIEW代码模块
由于LabVIEW VI是直接执行的,因此可以在LabVIEW开发环境或LabVIEW Runtime引擎中执行。 在开发环境中运行LabVIEW VI时,可以使用调试功能对代码模块问题进行故障分析,但执行速度较慢。 要进行生产测试,请使用LabVIEW Runtime引擎来调用VI。通过LabVIEW适配器对话框,可配置用于执行LabVIEW代码的LabVIEW服务器:
- 选择“配置”(Configure)»“适配器”(Adapters)
- 选择LabVIEW适配器,然后单击“配置”(Configure)
- 选择LabVIEW Run-time引擎或LabVIEW开发系统
为了进一步优化LabVIEW代码的加载时间,可以将代码模块VI内置到打包项目库(PPL)中。 由于PPL包含代码模块VI中所有VI依赖项的编译版本,因此LabVIEW可以更快地将依赖项加载到内存中。 另外,如果使用TestStand Deployment Utility部署代码,则可以在部署过程中为VI生成PPL。
有关结合使用PPL与TestStand Deployment Utility的更多信息,请参见使用LabVIEW打包项目库整理测试程序文件帮助主题。
通过并行测试提高测试性能
利用并行测试同时完成多个测试,通常可以提升测试速度。 TestStand所提供的功能有助于并行执行单个待测设备的测试,或同时测试多个待测设备。
并行执行测试序列
测试单个待测设备时,用户可以同时可测试系统的多个部分。 例如,考虑移动设备的测试序列。针对每个组件(例如蜂窝数据、用户输入和音频系统)的测试都可以在单独的子序列中实现。用户可配置序列调用步骤,异步调用序列,从而加快测试速度,而无需依次调用每个序列。
要指定应异步执行的序列调用,请执行以下操作:
- 选择一个序列调用步骤,然后单击“模块”(Module)选项卡。
- 在“执行选项”(Execution Options)菜单中,选择“使用新线程”(Use New Thread)或“使用新执行”(Use New Execution)选项。
在新线程中调用序列,可同时测试待测设备的不同部分
在配置异步序列调用时,请考虑使用新线程与使用新执行之间的区别:
新线程 | 新执行 |
作为调用方共享相同的结果集和报表 | 有自己的结果集和报表 |
直接执行 | 可以使用过程模型入口点执行 |
与调用方共享序列文件的全局值 | 有一个新的序列文件全局值副本 |
被调用方终止或暂停 | 独立终止或暂停 |
通常,用户应为测试序列中的相关测试使用新线程。 使用新执行的方式更适合较为独立的功能,例如应独立于测试序列运行的状态监视器。
有关选择使用新线程还是使用新执行的更多信息,请参阅在新执行中运行序列与在新线程中运行序列的区别。
获取异步序列调用的结果
要获得用于生成报表或记录数据库的异步子序列结果,请使用启动序列末尾的“等待”(Wait)步骤,等待异步序列调用完成。子序列线程完成后,TestStand会将异步子序列的结果附加到“等待”(Wait)步骤结果中,以便用于报表生成和数据库记录。要等待序列执行或线程,请在“等待”(Wait)步骤中选择“执行”(Execution)或“线程”(Thread),以便控制和指定要等待的执行或线程。 请记住,如果调用序列在线程之前完成,添加此等待可能会导致执行延迟,因此仅当需要新线程的结果时才使用此方法
使用等待步骤来获取异步序列调用的结果
并行测试多个待测设备
除了在测试序列中使用异步调用之外,TestStand还允许使用并行和批量过程模型来并行测试多个待测设备。 这些过程模型创建了多个执行,每个执行都在单独的待测设备上运行测试序列。 可更改当前测试站或单个测试序列文件的过程模型。
使用并行和批量过程模型同时测试多个待测设备
有关并行测试如何缩短测试时间的演示,请参阅TestStand附带的并行测试策略演示
选择并行或批量过程模型
借助并行过程模型,用户可在不同的时间开始和完成待测设备的测试,而批量过程模型的设计宗旨是同时在所有待测设备上开始和完成测试序列。
- 并行过程模型非常适合下列情况:使用单独的测试连接件,测试多个待测设备,每个待测设备单独测试。
- 批量过程模型非常适合下列情况:使用通用测试连接件或测试舱,对待测设备进行成组测试,所有待测设备必须同步测试
除了同时开始和结束每个批量测试之外,批量过程模型还能使用批量同步步骤和设置来进一步同步批量处理中所有待测设备的测试。如果应针对所有待测设备同时运行测试的某些部分,可使用步骤设置为单个步骤定义同步部分,或者使用批量同步步骤类型为多个步骤定义同步部分。
使用批量同步,确保测试的某些部分对于批量处理中的所有待测设备都是同步的
对于所有类型的批量同步部分,所有套接字都一起进入和退出该部分。 用户可进一步将同步配置为按顺序执行或仅在单个线程中执行。
如需了解更多关于批量同步的信息,请参阅同步步骤类型 – 批量同步示例
并行测试的硬件注意事项
并行测试多个待测设备时,可用的测试硬件可能会变为性能瓶颈。 使用共享硬件资源时,必须确保在任何给定时间只有一个线程在访问共享硬件资源,从而避免资源冲突。 用户通常使用“锁定”(Lock)设置或步骤类型来保留共享资源。 但如果多个线程正在等待单个资源来完成测试,那么并行测试的许多潜在性能提升将无法实现。 针对这种情况,可尝试以下方法:
- 使用“自动计划”步骤类型,在等待资源时执行其他测试。
- 使用执行评测工具查找导致瓶颈的硬件,并添加其他测试硬件。
使用自动计划
借助“自动计划”步骤类型,可配置一组能以任何顺序执行的测试,从而优化测试时间和硬件利用率。 在使用并行或批量过程模型执行自动计划部分时,每个套接字都会执行不需要保留资源的第一部分。因此,同一测试的不同执行之间的执行顺序可能会有所不同
可在执行顺序不是首要考虑因素时使用自动计划程序来优化硬件利用率
如果测试执行顺序不是首要考虑因素,请使用此方法。如果测试要求按特定顺序显示测试结果,请不要使用自动计划。
使用执行评测工具
TestStand附带的执行评测工具可用于识别限制测试系统执行速度的测试硬件。 依次打开“工具”(Tools)»“分析执行”(Profile Execution),从序列编辑器中启动执行评测工具。
借助执行评测器,可查看每个硬件资源处于活动状态的时间,从而针对向测试系统添加硬件所产生的影响做出明智的决策。 在下面的示例分析中,DMM得到充分利用,而示波器的利用率仅为66%。 根据此分析,添加第二个DMM或具有更多通道的DMM将会缩短此序列的测试时间。
借助执行评测工具,可直观了解哪些资源可能是测试配置中的瓶颈
优化硬件使用情况
通过确保以最有效的方式与硬件交互,缩短测试时间。 本节讨论管理硬件引用和测量方法以提高性能的注意事项。
优化硬件测量性能
对于任何给定的硬件配置,都存在一些可能会降低测试有效性的常见因素。例如,可以使用示波器来测量信号的上升时间、下降时间、RMS和峰值。如果要对示波器进行编程以捕获整个波形,请将波形传输到测试系统,然后对数据执行后处理以提取所需的测量数据,由于传输的数据量很大,因此性能将会下降。通信总线的延迟也会影响性能,因此应考虑仪器是否具有高延迟(例如LAN或串行连接)或低延迟总线(例如PCI或PXI)。
如果将示波器配置为测量上升时间、触发采集、从仪器读回上升时间并重复进行每次测量,则必须为每次测量重新配置和重新触发示波器。使用此选项,速度可能偏慢且效率低下。
鉴于许多现代示波器具有多个测量通道,请使用以下步骤来更快地执行测试:
- 设置测试,在示波器中配置四个测量通道(为上述每种测量分别配置一个)。
- 触发单次采集。
- 读回四个测量通道中的每个通道。
管理硬件引用寿命
频繁打开和关闭与硬件的会话可能会导致性能降低:在初始化与设备的通信时,许多驱动程序会传输大量数据来验证通信和配置。因此,最好在每个测试中仅初始化一次硬件,同时保持会话句柄,以便在整个测试中访问硬件。
要在测试中仅初始化一次硬件,可以使用ProcessSetup过程模型回调,该回调在所有测试代码之前运行。 对于并行和批量过程模型,无论有多少测试套接字,ProcessSetup仅执行一次。要清除引用,可以使用ProcessCleanup回调,该回调在所有测试完成后执行一次。有关创建和使用过程模型回调的更多信息,请参见在NI TestStand中使用回调。
要访问在过程模型回调中打开的硬件会话,可以使用在回调序列和MainSequence之间共享的文件全局变量。 也可以使用会话管理器,通过activeX对象自动管理硬件会话的生命周期。 如需更多关于使用会话管理器的信息,请参阅会话管理器示例。
优化结果处理
有多种方法可以优化结果集对系统性能的影响。
使用即时记录
对于内置结果处理器,可以选择“即时”(On-The-Fly)选项,在序列执行时(而不是在测试序列结束时)执行记录。 选择是否使用此设置时,请考虑以下优势和缺点
即时记录的优势:
- 允许测试操作员在测试执行时查看报表。
- 在测试程序出现严重错误的情况下保留结果。
- 如果与过程模型选项中的“丢弃结果”(Discard Results)或“模型不要求时禁用结果”(Disable Results when not Required by Model)设置结合使用,则占用内存会比较少。 启用此设置后,所有已处理的结果将从结果集中删除,从而释放内存。 对于生成报表,还必须在报表生成设置中启用“仅显示最新结果”(Only Display Latest Results)选项,节省内存。
即时记录的缺点:
- 由于频繁登录占用内存,因此测试速度降低。
- 记录是在单独的服务器中实现的,无法修改,因此更难以实现自定义。
如果用户主要是为了实现即时记录,而不太在意速度稍微变慢,可通过调整即时设置来减轻性能影响。 要访问这些设置,请执行以下操作:
- 选择“配置”(Configure)»“结果处理”(Result Processing)
- 选中“显示更多选项”(Show More Options)复选框,然后单击“高级”(Advanced)按钮。
为了提高性能,请增加处理间隔和/或最大结果数,从而减少TestStand记录结果的频率。
离线处理结果
为了减少生成结果所需的时间,可将结果数据记录在离线结果文件中,该文件是一种快速紧凑的原始结果格式,其中包含TestStand生成报表或记录到数据库所需的所有信息。 由于该文件只包含原始结果数据,处理时间更短,因此可提高测试吞吐量。
使用“离线结果处理工具”可将原始结果文件处理成测试报表,或将数据记录到数据库中。由于这是一个独立的工具,可以独立于测试运行,因此可以稍后处理结果或在其他计算机上处理结果。如果保持测试系统性能的优先级高于即时生成报表,请使用此工具。如需更多相关信息,请参阅TestStand离线结果处理工具帮助主题。
优化数据存储
尽管某些网络数据传输机制比其他机制更快,但是本地存储到硬盘驱动器的数据记录速度比存储到网络位置的记录速度更快。例如,使用Microsoft消息队列(MSMQ)与数据库进行通信,这会创建本地中间数据文件,然后通过网络进行传输。通常,这比直接写入远程数据库更快且更安全。尽管TestStand不提供使用MSMQ的原生功能,但可以使用第三方工具来实现此类通信。
仅记录所需的数据
另一个需要考虑的因素是记录到系统的数据量。随着记录数据量的增加,性能会有所下降。为了仅记录所需的数据,可禁用某些步骤或序列的结果记录。
通过取消选择“记录结果”(Record Result)选项(“步骤”(Step)»“属性”(Properties)»“运行选项”(Run Options)),可排除单个步骤的记录结果。也可使用“序列属性”(Sequence Properties)对话框中的“禁用所有步骤的结果记录”(Disable Result Recording For All Steps)设置,设置整个序列以排除结果记录。
失败后终止测试
在生产环境中,可能只需要知道待测设备存在失败测试,而不必具体了解是哪项测试。在此类情况下,可在第一次失败时终止测试以释放系统资源,稍后再获得更详细的故障分析。
根据测试,某些故障可能比其他故障更为严重。用户可能只希望在某些步骤失败时才终止测试。 因此,可为单个步骤或序列配置故障行为
要在特定步骤出现任何故障后结束测试,请执行以下操作:
- 在“步骤”(Step)属性中,选择“发布操作”(Post Action)
- 在“失败时”(On Fail)菜单中,选择“终止执行”(Terminate Execution)
要在特定序列出现任何故障后结束测试,请执行以下操作:
- 在序列窗格中右键单击一个序列,然后选择“序列属性”(Sequence Properties)。
- 在“步骤失败时”(On Step Failure)选项中,选择“转到清除”(Goto Cleanup)。
也可以为特定测试站配置此设置,例如仅在生产测试机上提前终止,而始终在生产线外的诊断机上完成完整测试。 要配置特定的测试机以在失败时终止测试,请执行以下操作:
- 选择“配置”(Configure)»“测试站选项”(Station Options)
- 在执行选项卡中,选择“序列失败时立即转到清除”(Immediately Goto Cleanup on Sequence Failure)设置。