corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Solaris 操作系统上 C/C++ 项目的 I/O 性能分析 - NetBeans IDE 6.8 教程

目录

本页上的内容适用于 NetBeans IDE 6.8
要求
简介
为教程设置 Solaris 环境
为教程创建项目
设置项目的性能分析配置
生成和运行性能分析演示项目
了解 I/O 使用情况
另请参见
小结

要求

要学习本教程,您需要具备以下软件。

软件 要求的版本
Solaris 10 或 OpenSolaris 操作系统 OpenSolaris、Solaris 操作系统版本 10
NetBeans IDE(支持 C/C++) 版本 6.8
Java Development Kit (JDK) 版本 6 或版本 5
C 和 C++ 编译器、makegdb 下文中提供了适用于 Solaris 的工具版本:
经测试可以与 NetBeans IDE 配合使用的 C/C++ 工具集合

请参见 NetBeans IDE 6.8 安装说明配置 NetBeans IDE 以使用 C/C++/Fortran
以获取有关下载并安装所需 NetBeans 软件的信息。

简介

具有 C/C++/Fortran 插件的 NetBeans IDE 6.8 包含 I/O 使用情况工具,用于观察 C/C++ 项目的输入/输出行为。该工具显示项目的读取和写入活动的总体图形视图,还显示读取和写入的各个文件以及字节数的明细视图。

本教程说明了如何在 Solaris 10 或 OpenSolaris 操作系统上运行的 C/C++ 项目中使用 I/O 使用情况工具。只有 Solaris 操作系统支持该工具,因为需要使用 Solaris DTrace 实用程序为该工具收集系统数据和程序数据。在 Solaris 操作系统上运行 C 或 C++ NetBeans 项目时,将缺省运行 I/O 使用情况工具。如果需要,可以在项目属性中禁用该工具。

如果您是 Windows 或 MacOS X 用户并且网络上有可用的 Solaris 系统,请注意,您可以在 PC 或 Mac 本地运行 IDE 并将项目设置为使用 Solaris 系统作为远程开发主机。通过进行远程开发,即使您在 Windows 或 MacOS X 上运行 IDE,也可以使用 I/O 使用情况工具和其他基于 Solaris 的工具。仅 NetBeans IDE 的 C/C++/Fortran 模块中提供了远程开发功能。有关如何进行设置以在远程开发主机上生成项目的详细信息,请参见 C/C++ 远程开发教程

本教程使用在基于 SPARC 处理器的单核 Solaris 系统上运行的项目。如果在基于 SPARC 或 x86 的 Solaris 操作系统上运行 NetBeans IDE 6.8,则可以按照本教程中的步骤进行操作。请注意,本教程使用“Solaris 操作系统”表示 OpenSolaris 和 Solaris 10 操作系统。

I/O 数据收集

可以使用 DTrace 收集输入/输出数据,该工具用于跟踪在 Solaris 10 和 OpenSolaris 操作系统中运行的程序的活动。将使用一个特殊 DTrace 脚本截取与 I/O 有关的 Solaris 系统调用:打开、创建、关闭、读取和写入。该脚本累积数据并将其传送到 NetBeans IDE 进行分析,然后 IDE 以图形方式显示这些信息;在单击“I/O 详细信息”按钮时,将以表格形式显示这些信息。

为教程设置 Solaris 环境

要使用 I/O 使用情况工具,运行 NetBeans 时使用的 Solaris 用户帐户必须具有足够的 DTrace 权限才能观察系统行为。用户帐户必须具有 dtrace_user、dtrace_proc 和 dtrace_kernel 权限。

要检查您的 DTrace 权限,请在命令提示符下键入以下命令:
/bin/ppriv $$

如果您的帐户具有所需的权限,ppriv 命令应返回如下内容:

E: basic,dtrace_kernel,dtrace_proc,dtrace_user
I: basic,dtrace_kernel,dtrace_proc,dtrace_user
P: basic,dtrace_kernel,dtrace_proc,dtrace_user
L: all

以 "I:" 开头的行很重要,因为它指定了从 shell 中启动的程序所继承的权限。如果您的帐户没有所需的可继承权限,并且您没有系统的管理员权限或 root 访问权限,应请求系统管理员为您的帐户添加 dtrace_user、dtrace_proc 和 dtrace_kernel 可继承权限。

如果您具有系统的管理员权限或 root 访问权限,则可以为您的用户帐户授予所需的权限,如下所述。

要为用户帐户永久授予所需的 DTrace 权限,请执行以下操作:
  1. 确保已从系统中注销要修改权限的用户帐户。
  2. 以超级用户 (root) 或其他管理员用户的身份登录。
  3. 在命令提示符下键入以下命令,并将 username 替换为要修改的用户帐户名:
    $ usermod -K defaultpriv=basic,dtrace_kernel,dtrace_user,dtrace_proc username
然后,您可以登录到该用户帐户,启动 NetBeans IDE,并使用具有 DTrace 数据提供器的性能分析工具。

要为用户帐户暂时授予所需的 DTrace 权限,请执行以下操作:

  1. 键入以下命令以确定 shell 进程的进程 ID:
    $ echo $$
  2. 成为超级用户 (root) 或其他管理员用户。
  3. 键入以下命令,将 process-ID 替换为从 echo 命令返回的进程 ID:
    $ ppriv -s I+dtrace_user,dtrace_proc,dtrace_kernel process-ID
现在,在 process-ID 指定的 shell 中键入的所有命令将继承所需的权限。用户帐户可以在此 shell 中启动 NetBeans IDE,并使用 I/O 使用情况性能分析工具。

为教程创建项目

为了说明 I/O 使用情况性能分析功能,我们将通过 IDE 中包含的性能分析演示样例应用程序创建一个新项目。

性能分析演示应用程序包含三个阶段,每个阶段在 10 秒钟内重复执行任务,以使用三种不同的方法生成一些相关活动以便在性能分析工具中进行显示。第一个任务在文件中写入一些数据,然后执行一些任务(数量不固定)以进行一些计算。计算任务数量取决于 CPU 数。

  • 对于单 CPU 计算机,任务集包含两个任务:一个任务在文件中写入数据,另一个任务执行一些计算。
  • 对于多 CPU 计算机,任务总数等于 CPU 数。如果 CPU 数为 N 个,则任务集包含 N 个任务:一个任务在文件中写入数据,N-1 个任务执行计算。

例如,如果开发主机有 32 个内核,则程序执行一个写入任务和 31 个计算任务。必须按 Enter 键才能开始执行每个任务,因此,必须注意输出窗口。

性能分析演示项目的各个阶段如下:

  • 串行演示是一个单线程程序,它依次运行两个任务,每个任务运行 10 秒。在具有大量 CPU 的系统上,这可能需要一些时间,因为将依次执行更多的任务集。
  • 并行演示是一个多线程程序,它在单独线程中同时执行相同的文件写入和计算任务,每个 CPU 执行一次。在多内核计算机上,此阶段比串行演示快得多,因为此阶段执行的任务数与串行演示相同,但这些任务是同时执行的。不过,无法防止线程竞争访问相同的数据,这可能会导致结果不准确。性能分析演示中的线程没有共享数据,因此不会出现结果不准确的风险。当然,在其他程序中不能保证能获得准确结果。
  • Pthread 互斥演示也是多线程程序,它执行与其他演示阶段相同的写入和计算任务。但是,这些代码使用互斥锁防止多个线程重叠访问某些函数。

创建性能分析演示项目

  1. 选择“文件”>“新建项目”以打开“新建项目”向导。
  2. 在该向导中,选择“样例”类别,然后选择 "C/C++" 子类别。
  3. 选择图中显示的“性能分析演示”样例,然后单击“下一步”。

    通过“性能分析演示”样例创建新项目的屏幕快照

  4. 您可以选择项目的名称和位置。此处,我们使用缺省的 ProfilingDemo_1 作为项目名称,以及使用缺省的 NetBeansProjects 目录作为项目位置。
  5. 单击“完成”退出向导并创建项目。

设置项目的性能分析配置

项目属性包括性能分析配置,可用于设置在运行项目时运行的性能分析工具。要显示 I/O 使用情况工具,您需要使用“C/C++ DTrace 扩展”性能分析配置,该配置指定了所有可用的性能分析工具。不过,本教程重点介绍 I/O 使用情况工具,因此,我们将创建自己的性能分析配置以选择一组更少的性能分析工具。本任务是可选的。

执行下列操作以创建新的性能分析配置:

  1. 右键单击项目名称,然后选择“属性”以打开“项目属性”对话框。
  2. 选择“分析”类别。“C/C++ DTrace 扩展”性能分析配置将处于选中状态。
  3. io-profile-configuration-dtrace

  4. 单击“Profiler 配置”列表旁边标有 "..." 的按钮以打开“Profiler 工具管理器”对话框。
  5. 从“Profiler 配置”列表中,选择“管理配置...”。
  6. 在“Profiler 配置管理器”对话框中选择“C/C++ DTrace 扩展”。
  7. 单击“复制”。
  8. 单击“重命名”并键入 CPU Memory I/O,然后单击“确定”。
  9. 此屏幕快照显示“名称”对话框以及打开该对话框之前需要访问的对话框。

    “Profiler 工具管理器”对话框

  10. 在“Profiler 配置管理器”对话框中单击“确定”。
  11. 在“Profiler 工具管理器”对话框中选择新的 CPU Memory I/O 配置。
  12. 取消选择工具列表中的线程微状态和线程使用情况工具,然后单击“确定”。
  13. 选择性能分析配置工具

  14. 要使用该配置,请在“项目属性”对话框的“性能分析配置”中选择 "CPU Memory I/O",然后单击“确定”。
  15. 选择新的性能分析配置

生成和运行性能分析演示项目

  1. (可选)如果要在 NetBeans 的输出窗口中显示项目输出(如本教程所示),请右键单击性能分析演示项目节点 然后选择“属性”。在“项目属性”的“类别”面板中单击“运行”节点,然后在“控制台类型”中选择“输出窗口”。单击“确定”。
  2. 右键单击性能分析演示项目节点,然后选择“生成”。
  3. “输出”标签将显示生成的结果,如下所示。


  4. 此屏幕快照中显示的编译器是 Sun Studio 工具集合的 cc 编译器。也可以使用 GNU C 编译器 gcc。

  5. 右键单击性能分析演示项目节点,然后选择“运行”。
    在运行性能分析演示项目期间出现提示时,按 Enter 键。
  6. 将打开“运行监视器”标签以显示 I/O 使用情况工具以及为性能分析配置定义的所有其他工具的动态图形。此处,我们使用所创建的 CPU Memory I/O 性能分析配置,因此仅显示三个工具。

  7. 运行监视器

    如果要查看所有工具,您可能需要增加“运行监视器”标签的大小,方法是单击并向上拖动“运行监视器”标签的上边框。在上面的屏幕快照中,“运行监视器”标签在垂直和水平方向上都有所增大,以使指示器更易于显示。也可以拖动工具上边框以增加特定图形的高度。

  8. 请注意,在输出窗口中,性能分析演示程序将告诉您所执行的操作,这样您就可以将其与 IDE 在工具中以图形表示的数据进行比较。例如,程序显示在要求您按 Enter 键之前经过的运行时间,显示将要分配的内存量,执行计算,然后释放内存。您可以看到该图反映了程序的活动。
  9. 串行演示输出
  10. 对于本教程,请运行程序一直到完成,每次出现提示时按 Enter 键。将保存收集的数据,我们将逐步执行程序并了解 I/O 使用情况工具的功能。

了解 I/O 使用情况

I/O 使用情况工具显示项目运行期间的程序读取和写入活动的概况。

  1. 下面的屏幕快照是在开始运行程序的串行演示部分时生成的,该阶段将在单个线程中依次运行两个任务。程序启动需要几秒钟的时间,然后等待用户按 Enter 键。在约 0:02 秒处,用户按 Enter 键,程序将在临时文件中写入字符。在 I/O 使用情况工具中,将使用橙色线显示写入的字节数以反映该活动。请注意以下内容:

    • I/O 使用情况工具的橙色线显示在最后一秒内写入的字节数。性能分析演示本身报告在此次串行演示运行期间总共写入 39690240 字节(约 38.7M)。如果累加橙色线上的所有数据点(从 2 秒到 12 秒),则总数接近 38.7M 字节。
    • 在该阶段,CPU 使用情况工具的系统时间较长,因为程序使用系统调用生成数据并将其写入到硬盘中。
    • 内存使用情况工具显示分配了 8K 字节内存堆,并且这一数字保持稳定。


  2. 在“运行监视器”窗口底部,可以看到一些用于控制图形视图的滑块。请将鼠标光标放在端点上以显示相关信息。
  3. C/C++ 性能分析工具教程中包含使用性能分析工具滑块的教程。

  4. 单击位于底部的水平滚动条并按住鼠标按钮,向左拖动滑块以查看开始运行时的情况。所有图形将一致地滑动,因此,可以看到各个区域(CPU、内存和线程)在特定时间发生的情况以及查看它们之间的关系。
  5. 从左向右拖动滑块以查看完整运行情况。
  6. 单击“I/O 详细信息”按钮。将打开“I/O 使用情况详细信息”标签,以显示标准输入、标准输出以及程序读取和写入的临时文件。


  7. 带有复选标记的文件已关闭,用黄色图标标记的文件仍打开以执行读取/写入操作。

  8. 请注意,此程序有时只需要按 Enter 键,因此,“已读取的字节数”列并不是很有用。您可以去掉“已读取的字节数”列,方法是单击列标题右侧的按钮以打开“更改可视列”对话框。单击复选框以取消选择“已读取的字节数”,然后单击“确定”。
  9. 假设您要详细了解该程序如何使用所有这些临时文件。在“I/O 详细信息”标签中,单击某个文件名以查看打开和关闭该文件的函数。函数名称显示在文件表格右侧的面板中。
  10. 双击右面板中的某个函数以打开调用该函数的源文件。在本例中,我们单击了 work_run_syscpu 函数并打开了 common.c 文件。


  11. 在“I/O 详细信息”标签中,可以指定要查看的时间间隔:在两个时间选择器中为间隔开始和结束时间选择或键入所需的秒数。如果键入秒数,可能需要按 Enter 键。

    这会更新函数列表以仅显示该间隔内收集的数据,因此,您可以精确查看在任何特定时间内在哪些文件中写入和读取了多少字节。还会更新图形以使用明亮颜色显示所选的时间间隔,这与颜色较暗的其余运行时间形成鲜明对比。
  12. 在“运行监视器”窗口中,可以看到写入活动的开始时间非常接近运行的开始位置。此时,性能分析项目的串行演示部分开始在临时文件中写入数据。串行演示有两个任务,各运行 10 秒,因此我们猜测要单独查看串行演示活动,应查看运行的 0:00 到 0:27 秒以将等待用户按 Enter 键等造成的延迟考虑在内。
  13. 在“I/O 详细信息”标签中,选择 0:27 作为结束时间。然后,将对数据进行过滤,以便重点关注串行阶段的输入/输出。请注意,图形指示器还会显示选择时间段进行过滤的效果。


  14. 请注意,在串行演示间隔内,“I/O 详细信息”标签中显示一个临时文件。单个线程将打开该文件并在其中写入数据,然后关闭该文件。请单击该文件以查看访问它的函数,然后双击某个函数以查看源代码。
  15. 返回到“运行监视器”窗口,将时间滑块滚动到约 0:30 秒处,可以看到写入活动经过暂停后在此处重新开始。写入暂停是在串行演示的计算任务期间发生的,此时没有硬盘写入活动。重新开始的活动显示程序进入并行演示部分,并且用户按 Enter 键以启动任务,将在单独线程中同时执行硬盘写入和计算。要单独查看并行演示活动,请在“I/O 详细信息”标签的“时间过滤器”中输入 0:28 秒作为开始时间,输入 0:41 秒作为结束时间,然后按 Enter 键过滤数据以便重点关注并行阶段的输入/输出。


  16. 请注意,在并行演示间隔内,“I/O 详细信息”标签中显示几个临时文件。即使只有一个线程在文件中写入数据,也会发生这种情况,因为它每秒钟都会切换到一个新文件。计算任务不在硬盘中写入数据。
  17. 单击其中的一个临时文件,可以看到文件是由 parallel_threadfunc 函数打开和关闭的。
  18. 在下面屏幕快照的约 0:40 秒处,I/O 活动再次发生变化。此时,程序进入 Pthread 互斥演示部分,并且用户按下了 Enter 键。通过选择 0:41 作为开始时间并选择“最大”作为结束时间,对此区域的数据进行过滤。键入值后,按 Enter 键。

  19. “I/O 详细信息”标签显示在 Pthread 互斥演示间隔内打开了多个文件。
    一个线程在文件中写入数据,它每秒钟都会切换写入的文件,这与并行演示间隔类似。不过,由于使用了互斥锁,计算线程有时会阻止写入线程,而无法继续写入文件。
  20. 尝试在启用线程使用情况工具的情况下重新运行此程序。可以将其添加到本教程创建的性能分析配置中,方法是选择“工具”>“性能分析工具”,然后选择该配置和“线程使用情况”工具。

另请参见

有关在后台编译运行项目的相关数据时使用 DTrace 技术的更多信息,请参见 BigAdmin DTrace 门户

在 Solaris 操作系统上使用线程微状态工具中介绍了线程微状态工具。

C/C++ 性能分析教程中介绍了 CPU 使用情况、线程使用情况和内存使用情况工具。

有关 NetBeans IDE 的其他 C/C++ 教程,请参见 C/C++ 应用程序学习资源

小结

本教程介绍了有关 I/O 使用情况性能分析工具的以下内容:

  • 可以使用 Solaris DTrace 实用程序自动收集 Solaris 平台上的 I/O 信息。
  • 可通过使用性能分析配置选择显示的图形性能分析指示器。
  • 只能在“C/C++ DTrace 扩展”性能分析配置或您自己的配置中找到 I/O 使用情况工具。
  • 可以在项目属性的“配置文件”类别中进行性能分析设置。
  • 单击“I/O 详细信息”按钮将导致显示程序函数执行的 I/O 操作的详细信息。
  • 单击详细信息标签中的函数将导致打开包含该函数的源文件,并将光标放在调用该函数的行上。
  • 如果您可以访问网络上某个运行 Solaris 操作系统的系统,则可以从 Windows 或 Mac 计算机中使用 I/O 使用情况工具,方法是将 Solaris 系统设置为用于生成和运行项目的远程开发主机。