利用应用程序剖析调优 ILE 程序性能

本文介绍了 IBM i 上 ILE 程序剖析的相关知识,怎样进行程序剖析,剖析优化的步骤及程序剖析使用的命令,包括怎样启用剖析数据收集功能,怎样开始收集剖析数据,怎样结束数据收集并基于收集到的数据优化程序的内部指令存储顺序,如何判断一个程序或模块是否已经剖析优化和剖析优化状态,以及一些需要注意的问题等。

王春龙, 高级软件工程师, IBM

王春龙是 IBM 中国系统与科技实验室的高级软件工程师,从事 IBM i 平台 Lotus Domino 开发工作。



王双红, 资深软件工程师, IBM

王双红是 IBM 中国系统与科技实验室的一名资深软件工程师,从事 IBM i 平台 Lotus 产品开发工作,并担任技术负责人。



2011 年 8 月 24 日

应用程序剖析调优 ILE 程序性能

正在思索如何提高您的 ILE 程序的性能吗?您可以试试 ILE 程序剖析。通过 ILE 程序剖析,可以优化您的 ILE 程序性能。

ILE 程序剖析首先启用剖析数据收集功能,然后通过运行程序收集应用程序执行过程中的统计数据,例如,分支语句中每一个分支执行的次数,每一个过程调用另外的过程的次数等,之后依据收集到的这些数据,调优程序中代码顺序提高 ILE 程序性能。

应用程序剖析带来程序性能提升的同时并不会改变程序的执行语义。应用程序剖析能带来的多大性能提升取决用应用程序的类型。通常来讲,如果应用程序大部分时间都是在运行自己的代码而不是大部分时间在调用系统的库函数或者进行输入输出操作,这样的应用程序在应用了程序剖析优化后会有更多性能提升。


ILE 程序剖析的两种方式

对 ILE 应用程序进行剖析可以通过两种方式:

  • 对代码块顺序调优。该方式会记录每一个分支的执行次数,然后依据收集的数据对过程内的代码进行多种剖析优化。例如,其中一种剖析优化方式将使最频繁执行的代码路径相邻,这样会提高指令缓存及指令预取单元的效率,减少从内存中读取指令的频率。
  • 对过程顺序调优。该方式会记录程序内每一个过程调用其他过程的次数,然后依据收集的数据优化程序内的过程的存储顺序,最频繁调用的过程会存放在相邻位置,进而当一个过程调入内存中时,其要调用的过程也很可能同时调入内存,减少了内存页的换入换出。

经过上述两种方式的优化,程序内部的代码块以及过程的存储顺序将被调整调优,以尽量多的从利用指令缓存及指令预取单元,减少内存页的换入换出,从而提升程序的运行性能。

虽然允许单独进行代码块顺序调优,也可以单独进行过程顺序调优,但推荐两种方式结合在一起使用,以获得更好的性能。一起应用两种方式调优并不需要特别的额外操作,请参见本文后面的“怎样应用收集到的剖析数据优化程序”。


应用程序剖析优化 ILE 程序的步骤

要通过应用程序剖析优化 ILE 程序,首先启用剖析数据收集功能,然后运行程序收集剖析数据,最后应用剖析数据优化程序。具体步骤如下图所示:

图 1. 应用程序剖析优化 ILE 程序的步骤
SSD 与 HDD 性能比较图

在启用了剖析数据收集功能阶段,代码将以特殊的方式编译,一些“钩子”将被添加到代码中,这些“钩子”用于记录运行程序时所发生的“事件”,例如,一个循环运行了多少次等等。

在收集剖析数据阶段,程序运行时的所发生的“事件”将被记录下来,这些记录将附在 Program 或 Service Program 之中。同时,这些记录并不是每次变化时就写入到 DASD(直接访问存储设备)中,否则会大大降低程序运行的效率;这些记录只有在程序换页时才会写入 DASD,可以执行 CLRPOOL 命令清空程序运行的存储池,来确保写入 DASD。

在应用收集的剖析数据优化阶段,收集到的数据将被分析,用于调优代码块及过程顺序,同时,添加的“钩子”将被移除,“钩子”移除后,剖析数据收集功能已不在启用,如果想重新收集剖析数据,还要重新启用剖析数据收集功能。


启用剖析数据收集功能

启用剖析数据收集功能可以通过执行命令 CHGMOD、CHGPGM 或 CHGSRVPGM 来实现:

  • 通过执行命令 CHGMOD,设置命令参数 PRFDTA 值为 *COL 来启用 Module 的剖析数据收集功能。前提条件是需要保证该 Module 的优化级别为 30 或更高。然后,可以通过这些 Module 创建或更新 Program 或 Service Program。
  • 通过执行命令 CHGPGM 或 CHGSRVPGM,设置命令参数 PRFDTA 值为 *COL 来启用 Program 或 Service Program 中所有 Module 的剖析数据收集功能。也需要首先保证其中的 Module 的优化级别为 30 或更高。在 IBM i 5.2 版本之后,虽然优化级别在 30 以下的 Module 也可以一起绑定进来,但这些 Module 将不参与程序剖析,也即无法针对这些 Module 进行性能优化。

同时,在创建 Module 的时侯,如果这个 ILE 语言的创建 Module 的命令有启用剖析数据收集功能的参数,也可以通过设置命令中的该参数来启用收集功能。例如,对于C语言,可以通过设置 CRTCMOD 命令参数 PRFDTA 值为 *COL 来启用 Module 的剖析数据收集功能,当然,这也需要首先保证创建 Module 的优化级别为 30 或更高,命令如下所示:

CRTCMOD MODULE(MYLIB/CModule) OPTIMIZE(30) PRFDTA(*COL)

需要注意的是,如果这个程序在之前已经应用程序剖析优化过,则在启用了剖析数据收集功能后,以前的优化数据将被清空。

如果想知道当前 Module、Program 及 Service Program 是否已经启用剖析数据收集功能,需要怎么做呢?可以通过执行命令 DSPMOD、DSPPGM 及 DSPSRVPGM 来查看 Module、Program 及 Service Program 剖析数据收集功能的启用状态。

  • 如果″Profiling data″属性显示为 *NOCOL,那么剖析数据收集功能没有启用;
  • 如果″Profiling data″属性显示为 *COL,那么剖析数据收集功能已经启用。

其中,运行 DSPPGM 及 DSPSRVPGM 显示的是这个 Program 或 Service Program 的剖析数据收集功能的启用状态,如果想查看绑定到 Program 或 Service Program 的具体每一个 Module 的是否启用,可以在执行 DSPPGM 或 DSPSRVPGM 命令时声明参数 DETAIL(*MODULE),然后通过选项 5 进入 Module 属性,查看 Program 或 Service Program 中所绑定的具体每一个 Module 的剖析状态,

  • 如果″Profiling data″属性显示为 *NOCOL,那么这个绑定的 Module 没有启用剖析数据收集功能;
  • 如果″Profiling data″属性显示为 *COL,那么这个绑定的 Module 的剖析数据收集功能已经启用。

此外,如果要停用剖析数据收集功能,可以通过执行命令 CHGMOD、CHGPGM 或 CHGSRVPGM,并设置命令参数 PRFDTA 值为 *NOCOL 来实现。


启动、停止收集剖析数据

执行命令 STRPGMPRF 启动剖析数据收集,执行命令 ENDPGMPRF 停止剖析数据收集。这两个命令均没有参数。同时,当系统 IPL(Initial Program Load)后, 剖析数据收集将自动终止。

执行了命令 STRPGMPRF 后,正在运行的、并且启用了剖析数据收集功能的 Program 或 Service Program 都将开始收集剖析数据,不管这个 Program 或 Service Program 是在命令 STRPGMPRF 执行前开始运行的,还是在命令 STRPGMPRF 执行后开始运行的。

应用 ILE 程序剖析后,性能提升的多少,与程序剖析是否能够准确定位该代码中的热点区域有紧密关系。要想准确定位代码中热点区域,在收集剖析数据时,就需要尽可能模拟用户的实际工作环境,所使用的输入数据尽可能的与用户实际使用的数据相近。

为了能得到一个更有效的统计数据,可以在执行命令 STRPGMPRF 前,清空以前收集的剖析数据。清空剖析数据的方式可以有多种,在 Program 或 Service Program 已经启用剖析数据收集功能的前提下可以通过下面的方式清空剖析数据:

  1. 可以通过执行命令 CHGPGM 或 CHGSRVPGM 来清空剖析数据。将命令参数 PRFDTA 值设置为 *CLR,执行命令,剖析数据将被清空。需要注意的是,声明 PRFDTA(*CLR) 参数时,程序不能正在运行。
  2. 可以通过执行命令 CHGPGM 或 CHGSRVPGM 让 Program 或 Service Program 重建,这样所有的剖析数据也将被清空。例如,运行 RSTOBJ 命令并声明了参数 FRCOBJCVN(*YES *ALL),将导致程序重建,这时对于启用了剖析数据收集功能的 Program 或 Service Program,会导致以前收集的剖析数据清空为零。在比如,因为程序需要重建来改变优化级别,这样将一个程序的优化级别从 30(即 *FULL,优化级别为 30 等于优化级别为 *FULL)改变到 40,也会导致启用了剖析数据收集功能的 Program 或 Service Program 的以前收集的优化数据清空为零。
  3. 也可以通过执行命令 UPDPGM 或 UPDSRVPGM 更新 Program 或 Service Program,如果更新后 Program 或 Service Program 仍然启用剖析数据收集功能,这样所有的剖析数据也将被清空。例如,一个 Service Program 如果包括多个 Module,只要保证其中一个 Module 启用了剖析数据收集功能,这个 Service Program 就启用了剖析数据收集功能;这样通过 UPDSRVPGM 更新其中的 Module,不论这些 Module 是否启用剖析数据收集功能,只要最后这个 Service Program 中包括至少有一个 Module 启用了剖析数据收集功能,剖析数据就会被清空。如果最后这个 Service Program 中没有一个 Module 启用了剖析数据收集功能,那么这个 Service Program 将不再启用剖析数据收集功能。

利用收集到的剖析数据优化程序

执行命令 CHGPGM 或 CHGSRVPGM 来应用收集到的剖析数据优化程序:

  • 将参数 PRFDTA 声明为 *APYBLKORD,来应用收集到的数据对代码块顺序进行优化;
  • 将参数 PRFDTA 声明为*APYALL 或 *APYPRCORD,来应用收集到的数据对代码块顺序及过程顺序进行优化。

需要注意的是,即使在参数 PRFDTA 声明 *APYPRCORD,运行 CHGPGM 或 CHGSRVPGM 后,也将对代码块顺序及过程顺序都进行优化;如果只想对过程顺序进行优化,首先,要在 CHGPGM 或 CHGSRVPGM 命令参数 PRFDTA 声明 *APYALL 或 *APYPRCORD,执行命令,一起优化代码块顺序及过程顺序;然后,执行命令 CHGPGM 或 CHGSRVPGM 移除 *BLKORD observability 重建程序,这样将只对过程顺序进行优化(关于 *BLKORD observability,请参见“一些要注意的问题”小节)。

同时,应用了收集到的剖析数据优化后,在启用剖析数据收集功能时所附加到程序中的一些机器指令将被移除,剖析数据收集功能将不在启用。

如果想知道当前 Module、 Program 或 Service Program 剖析优化状态,需要怎么做呢?可以通过执行命令 DSPMOD、DSPPGM 及 DSPSRVPGM 查看 Module、Program 及 Service Program 剖析优化状态。

  • 如果″Profiling data″属性显示为 *APYBLKORD,那么这个 Program 或 Service Program 中的一个或多个 Module,已经基于收集到的数据进行了代码块顺序优化,同时剖析数据收集功能已不在启用;
  • 如果″Profiling data″属性显示为 *APYPRCORD,那么这个 Program 或 Service Program 中的一个或多个 Module,已经基于收集到的数据进行了过程顺序优化,同时剖析数据收集功能已不在启用;
  • 如果″Profiling data″属性显示为 *APYALL,那么这个 Program 或 Service Program 已经基于收集到的数据优化了程序(包括了代码块顺序优化及过程顺序优化),同时剖析数据收集功能已不在启用。

其中,运行 DSPPGM 及 DSPSRVPGM 显示的是这个 Program 或 Service Program 剖析数据收集功能的启用状态,如果想查看绑定到 Program 或 Service Program 的具体每一个 Module 是否启用,可以在执行 DSPPGM 或 DSPSRVPGM 命令时声明参数 DETAIL(*MODULE),通过选项 5 进入 Module 属性,查看 Program 或 Service Program 中所绑定的具体每一个 Module 的剖析状态,

  • 如果″Profiling data″属性显示为 *APYBLKORD,那么这个 Module 已经基于收集到的数据进行了代码块顺序优化,同时剖析数据收集功能已不在启用。

此外,选项 5 进入后还可以查看到 Module 的更多剖析优化信息,

  • ″Number of procedures block order measured″属性显示这个 Module 中,有多少个过程在剖析数据收集过程中,统计过代码块调用情况。
  • ″Number of procedures block reordered″属性显示这个 Module 中,有多少个过程的代码块顺序被优化过。

一些要注意的问题

执行命令 CHGPGM 或 CHGSRVPGM 并声明参数 PRFDTA(*APYBLKORD),或 PRFDTA(*APYALL) 或 PRFDTA(*APYPRCORD) 应用收集到的剖析数据优化程序后,不能直接再一次应用剖析优化;如果想再一次剖析优化,需要重新首先启用剖析数据收集功能,运行程序收集剖析数据,然后应用剖析数据优化程序。

一个已经剖析优化的 Program 或 Service Program,即剖析优化状态为 *APYALL、*APYBLKORD 或 *APYPRCORD 的 Program 或 Service Program,不能直接通过执行 CHGPGM 或 CHGSRVPGM 命令,设置其剖析优化状态为 *NOCOL;要首先启用 Program 或 Service Program 的剖析数据收集功能,也就是执行 CHGPGM 或 CHGSRVPGM 命令并设置其中参数 PRFDTA(*COL),然后执行 CHGPGM 或 CHGSRVPGM 命令,设置剖析优化状态 *NOCOL。

在进行剖析优化之后,会在 Program 或 Service Program 中附加上两个额外的 observability,通过执行 CHGPGM 或者 CHGSRVPGM 命令可以移除 Program 或者 Service Program 中附加的 observability。

  • 一个是 *BLKORD observability,当一个 Program 或 Service Program 完成了代码块顺序优化后,就会被附上这个 observability。
  • 另一个是 *PRCORD observability,当一个 Program 或 Service Program 完成了代码块及过程顺序优化后,*PRCORD observability 和 *BLKORD observability 就都会被附加到这个程序上。

附加上了这两个额外 observability 之后,当 Program 或 Service Program 重新创建时,就能够应用这些信息再次进行剖析优化。当一个 Program 或者 Service Program 应用了剖析优化之后又移除了 observability,这时该 Program 或 Serive Program 依然是剖析优化的,但是由于任何原因导致程序重新创建时就无法再次应用之前的剖析优化了。对于已经剖析优化的 Program 或 Service Program,当重新启用剖析数据收集功能时,不论是否有上述两个 observability,优化数据都会被清空。


结束语

还在思索方法来提高您的 ILE 程序性能吗?为何不现在就试试 ILE 程序剖析呢。

程序剖析最好在整个应用程序开发的末尾阶段进行,因为这样可以节省很多重复的不必要的额外工作。通常可以在应用程序开发完成、并完全测试后,应用程序剖析来进一步提高程序性能。

程序剖析会延长 Program 或 Service Program 的创建时间。对于大型项目,可以首先挑出最频繁运行的 Program 或 Service Program,只针对这些最频繁运行 Program 或 Service Program 进行程序剖析操作,这样即优化了性能,又不会对程序创建时间带来太多影响。

本文最后列出ILE程序剖析所使用的命令流程,供读者快速参考:

  1. CHGPGM 或CHGSRVPGM ... PRFDTA(*COL) :启用剖析数据收集功能;
  2. STRPGMPRF:开始剖析数据收集;
  3. 运行程序;
  4. ENDPGMPRF:停止剖析数据收集;
  5. CHGPGM 或 CHGSRVPGM…PRFDTA(*APYBLKORD) 或 PRFDTA(*APYPRCORD) 或 PRFDTA(*APYALL) :应用剖析数据优化程序。

参考资料

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=IBM i
ArticleID=753833
ArticleTitle=利用应用程序剖析调优 ILE 程序性能
publish-date=08242011