使用性能监视器跟踪NI软件的内存使用情况

更新 Aug 3, 2023

环境

软件

  • TestStand
  • LabVIEW

操作系统

  • Windows

如何使用性能监视器来跟踪和记录系统和过程信息?

性能监视器(PerfMon)是Windows监视工具,可以绘制和记录特定进程的性能指标。将此工具与独特的测试用例结合使用,以隔离导致内存增长的系统组件。与任务管理器不同,性能监视器会定期测量内存使用情况,如果测试系统必须在很长一段时间内运行才能明显看到内存增长,这将很有用。

本教程向您展示如何使用性能监视器来测量TestStand进程的内存使用情况,如何在图形上显示此信息以及如何将数据保存到日志文件中。
  1. 从开始菜单启动性能监视器。
  2. 要查看内存使用情况图,请在配置树中单击“性能监视器”。
性能监视器通过图形化计数器的值来显示信息。计数器代表内存使用情况和系统性能的各个方面。您可以配置“性能监视器”图上显示的计数器集。
  1. 在“性能监视器”窗口底部的表中选择任何现有计数器。
  2. 按键盘上的Delete键可从图形显示中删除这些计数器。
  3. 右键单击图形区域。点击添加计数器...
出现“添加计数器”对话框。有一个可滚动的列表框,其中提供了所有计数器,并按组进行了分类。



6.找到您感兴趣的组,将其展开,然后选择一个计数器。

对于内存增长问题,在所有堆中启用专用字节,句柄计数,线程计数,#ByteGen2堆大小计数器通常很有用。所有这些指标都是应用程序当前使用的资源的快照。下表解释了每个计数器的含义。
注意:对于表中未包含的其他任何计数器,请启用“显示描述”以查看计数器的描述。
计数器描述
处理专用字节进程正在使用的专用内存量。进程的虚拟内存空间由只能由该进程访问的私有内存和可由其他进程访问的共享内存组成。
处理处理计数进程的对象表中的对象句柄数。维护对仪器驱动程序会话的引用,加载LabVIEW VI和许多其他操作,可能会导致句柄数量增加。
处理线程数进程中正在运行的线程数。
.NET CLR内存所有堆中的#字节进程用于存储.NET对象的内存总量。
.NET CLR内存第2代堆大小进程用于在Gen 2堆上存储.NET对象的内存量。第2代堆是.NET内存区域,用于存储已存在内存中很长时间的对象。该值可能指示不再需要.NET对象时,它们不会被释放。
  1. 在“所选对象实例”列表中选择感兴趣的过程。
对于TestStand系统,这通常是SeqEdit或用户界面可执行文件的名称,具体取决于您是在TestStand Sequence Editor中还是在用户界面中执行测试系统。
对于LabVIEW应用程序,选择LabVIEW
  1. 单击添加按钮,将计数器添加到“添加的计数器”列表中。
  2. 重复步骤6-8,直到“添加的计数器”列表中包含所有需要的计数器。
  1. 在“添加计数器”对话框上,单击“确定”。性能监视器图开始使用新添加的计数器的值进行更新。


配置性能监视器图

您可能需要调整图形的设置,以确保正确缩放所有计数器的值以适合图形显示,并确保图形显示足够长的时间的数据,以便您确定内存使用率是否随着图形显示的增长而增加。系统执行。
  1. Ctrl + Shift + A选择窗口底部表格中显示的所有计数器。
  2. 右键单击并选择“缩放选定的计数器” 。这将缩放每个计数器的值,以使计数器在图形窗口中可见。
  3. 右键单击图形,然后选择“属性...”,将出现“性能监视器属性”对话框。
  4. 在“常规”选项卡上,设置“采样每个值”和“持续时间”值,这样图形将显示长时间的内存增长。
例如,可以将“每个采样值”设置为10,将“持续时间”值设置为10000,以每10秒绘制一个新值,并在图形窗口中显示总共约2.5小时的信息。

  1. 单击确定
  2. 右键单击图形区域,然后选择清除。在运行测试用例之前,这将删除所有现有的图形数据。
  3. 执行一个测试案例。检查性能监视器图,以确定在测试系统执行时是否有任何计数器值在增长。


将内存数据记录到文件

  1. 在配置树中右键单击“性能监视器”。选择新建»数据收集器集。

  1. 输入数据集的名称。按下一步

  1. 选择您要保存日志文件的位置。单击下一步
  2. 选择保存并关闭。点击完成
新的数据收集器集将出现在“配置”树中的“数据收集器集>>用户定义”下


要开始记录性能数据时,请右键单击“数据收集器集”,然后选择“开始” 。要停止记录,请右键单击并选择停止



这是运行测试用例后“性能监视器”图的外观示例:



专用字节数计数器(蓝线)以恒定速率增长,而所有堆和第二代堆大小计数器中#字节却没有。这表明Sequence Editor进程的内存空间随时间增长,这表明可能发生内存泄漏。由于所有堆第2代堆大小计数器中的#字节都不会随着时间增长,因此内存增长似乎不是由.NET内存引起的。如果这些计数器在增长,则表明该进程正在继续打开.NET引用,而不是关闭不再需要的引用。

有关Gen 2堆大小和.NET垃圾回收的重要性的更多信息,请参阅《 外部:垃圾回收基础》