使用 fdpr 程序重构可执行程序
fdpr(反馈定向程序重构)程序对可执行模块进行优化,使其执行更快且更有效地使用实内存。
要确定是否安装了 fdpr 程序且可以使用,运行下列命令:
# lslpp -lI perfagent.tools
fdpr 命令是一个性能调整实用程序,可以提高用户级应用程序的性能和实内存利用率。 源代码不是 fdpr 程序必需的输入。 但是不支持条形的可执行程序。 如果源代码可用,那么用编译器标志 -qfdpr 构建的程序将包含某些信息,以协助 fdpr 程序用保证功能生成经过重新排序的程序。 如果使用 -qfdpr 标志,对一个程序所有的目标模块都应使用该标志。 如果使用 -qfdpr 标志,静态链接将不会增加程序性能。
fdpr 工具重新排序一个可执行程序中的指令来提高指令高速缓存、转换后备缓冲区 (TLB) 和实内存的利用率,它执行了下面的操作:
- 将执行较多的代码序列(通过概要分析确定)打包到一起。
- 将条件分支重编码以改善硬件分支预测。
- 将不常执行的代码移到行外
例如,假设一个“if-then-else”语句,fdpr 程序可能认为程序使用 else 分支比使用 if 分支更频繁。 于是它将条件逆转,下图显示了两个分支:

CPU 绑定的大型应用程序(大于 5 MB)可最多将执行时间减少 23%,但是通常来说,性能提高在 5% 和 20% 之间。 对这类程序,文本页实内存需求的减少可能达到 70%。 平均在 20% 和 50% 之间。 这些数字依赖于应用程序的行为和使用 fdpr 程序时采用的优化选项。
fdpr 的处理在三个阶段发生:
- 检测要优化的可执行模块,以允许收集详细的性能数据。
- 已检测的可执行模块运行在一个由用户提供的工作负载下,从运行开始的性能数据被记录下来。
- 性能数据用来驱动一个性能优化进程,产生的结果是一个重新构造的可执行模块,该模块应该更有效地执行运用所检测的可执行程序的工作负载。 用来驱动 fdpr 程序的工作负载应该与该程序实际使用时的工作负载紧密匹配,这点至关重要。 具有与用于驱动 fdpr 程序的工作负载基本不同的重组可执行程序的性能不可预测,但可能比原始可执行程序的性能更差。
作为示例,# fdpr -p ProgramName -R3 -x test.sh 命令将使用测试用例 test.sh 来运行检测形式的程序 ProgramName。 该运行的输出将用来执行对该程序的最激进优化(-R3),以形成缺省称为 ProgramName.fdpr 的新模块。 在生产中的可执行程序比其前任运行更好的程度主要取决于测试用例 test.sh 对生产中工作负载成功模仿的程度。
注: fdpr 程序包含高级优化算法,这些算法有时导致优化的可执行程序无法以与原始可执行模块相同的方式运行。 任何优化的可执行程序在用于任何生产环境中之前;也就是说在它的输出得到信任之前,应进行充分测试,这一点绝对重要。
总的来说,fdpr 程序的用户应当遵守以下几点:
- 尽力使用一个工作负载来驱动可代表预期使用情况的 fdpr 程序。
- 充分测试所产生的重新构造的可执行程序的功能。
- 只对已经调整的工作负载使用重新构造的可执行程序。