如果还没有为 synprog 收集性能数据,必须进行收集。相关说明参见为 synprog 示例收集数据。
此部分示例说明创建子孙进程的不同方法以及如何处理子孙进程,并演示了时间线,以便大致了解创建子孙进程的程序的执行过程。该程序派生两级子孙进程。父进程执行某些工作之后,调用 popen,然后再执行另一些工作。第一个子孙进程执行一些工作,然后调用 exec。第二个子孙进程调用 system,然后调用 fork。调用 fork 的子孙进程立即调用 exec。在执行一些工作之后,该子孙进程再次调用 exec 并执行另外一些工作。
% cd work-directory/synprog % analyzer test.2.er &
加载父实验时,便会自动加载子孙实验,但其数据会被滤出。
每个实验的最顶层的栏是抽样栏。其下面的栏包含基于时钟的分析事件数据。
有些抽样呈黄色和绿色。绿色表示进程在用户 CPU 模式下运行。绿色的抽样部分指出了在用户 CPU 模式下花费的时间数。由于多数时候有三个进程在运行,因此每个抽样只有约三分之一的部分呈绿色。其余部分呈黄色,表示进程正在等待 CPU。当要运行的进程多于可用的 CPU 时,这种显示是正常的。当父进程(实验 1)完成执行过程,正在等待其子进程完成时,运行进程的抽样一半呈绿色,一半呈黄色,表示只有两个进程在竞争 CPU。当生成实验 3 的进程完成后,其余进程(实验 7)就可以独自使用 CPU,并且在此之后,实验 7 的抽样全部呈绿色。
可以拖曳要放大的区域或者单击放大按钮 进行放大,或者选择 [时间线]
[放大],或键入 Alt-T,I。
实验 3 和实验 7 的事件标记器之间都有间隙,但一个实验中的间隙会在另一个实验中的事件标记器所在的位置出现。这些间隙表示一个进程正在等待 CPU,而另一个进程正在执行。
可用下述方法复位显示:单击 [复位显示] ,或者选择 [时间线]
[放大 x2],或者键入 Alt-T,R。
有些实验不会延续整个运行时间长度。这种情形由时间区域中的浅灰色所指示,此情形下的实验没有任何数据。实验 3、5、6 和 7 的创建是在它们的父进程完成某些工作之后进行的。成功调用 exec 后,实验 2、5 和 6 终止。实验 3 在实验 7 及其进程正常终止之前结束。exec 的调用点清楚显示:实验 3 的数据在实验 2 的数据的结束处开始,实验 7 的数据在实验 6 的数据的结束处开始。
由于成功调用 exec 而终止的实验在 [实验] 标签中显示为“无效实验”。实验图标上有一个用红圈圈起来的十字。
文本窗格底部有一个警告,指出实验已经异常终止。只要进程成功调用 exec,进程图像就会被替换,而收集器库也将被卸载。实验无法正常完成,而只能在加载到分析器之后才能完成。
抽样栏中的深灰色区域指出了等待 CPU 或用户锁定之外所花费的等待时间。实验 1 的第一个深灰色区域在调用 popen 时出现。大部分时间都用于等待,不过在此时间段内会记录一些事件。在此区域中,popen 创建的进程使用 CPU 时间并与其它进程竞争,但不在实验中记录。类似地,实验 4 的第一个深灰色区域在调用 system 期间出现。在此情况下,调用进程会等到调用完成后才工作。由于调用 system 而创建的进程也会与其它进程竞争 CPU,并且不会记录实验。
实验 1 中的最后一个灰色区域在进程等待其子孙进程完成的过程中出现。记录实验 4 的进程在调用 system 完成之后调用 fork,然后进行等待,直至其所有子孙进程均完成。此等待时间由最后一个灰色区域指示。在这两种情况中,等待进程不执行任何工作,也没有任何未对实验进行记录的子孙进程。
实验 4 的大部分时间用于等待。因此,直到实验完全结束之后,它才会记录分析数据。
实验 5 根本没有任何数据。它由于调用 fork(之后会立即调用 exec)而创建。
充分放大之后,可以看到在实验 5 中有一个非常小的抽样。
实验记录了初始抽样点和调用 exec 过程中的抽样点,但没有持续足够的时间来记录任何分析数据。这就是实验 5 没有分析数据栏的原因。
如果可以访问多处理器计算机,则请再次执行第二次数据收集。在时间线的显示中看到哪些不同之处?
另请参见 | |
---|---|
时间线标签 事件标签 解释时间线显示 查找程序中的问题时段 |