IBM® Advanced Toolchain for PowerLinux 交叉编译器的实际价值在于,开发人员可在他们已熟悉的开发平台上(在大多数情况下是 x86)编译和构建 IBM Power Architecture® 应用程序。本文将介绍开发人员如何使用 Toolchain 交叉编译器,轻松地构建在 Power Architecture 上运行的源代码。本文还会回答有关交叉编译的应用程序性能、功能和在 IBM PowerLinux™ 服务器上原生地调试交叉编译应用程序的能力的问题。
简介将在 x86 服务器上运行的 Linux® 应用程序移植到另一个平台上,比如 PowerLinux,需要设置一个不同的构建环境来编译该应用程序,是吗?没有必要。您可以在 x86 服务器上使用交叉编译器,构建针对一种不同平台架构(比如 IBM Power®)的应用程序二进制文件。交叉编译器已存在很长时间。它们主要用于为具有有限的资源的嵌入式系统构建应用程序,以便运行能够支持原生编译器的操作系统。我第一次了解交叉编译器是在参与一个针对手持设备的项目的时候。我在 x86 工作站上编写并编译源代码,并通过一个串行通信连接来将这些二进制文件加载到设备中。最近,我正在使用交叉编译器构建简单的应用程序,以便控制我所研究的一个遥控设备的伺服电动机。好了,我们进入正题。
本文将介绍 IBM Advance Toolchain for PowerLinux 中包含的交叉编译器。从这里开始,我会将 IBM Advance Toolchain for PowerLinux 称为 “toolchain”。toolchain 是一组开源开发工具和运行时库,它使用户能够在 Linux 上利用 IBM 最新的 Power 硬件特性。toolchain 本身是自成一体的,不依赖于系统 toolchain。它安装在 /opt 中,所以不会覆盖默认的 Linux 发行版 toolchain。截至撰写本文时,最新版本包含以下包的最新稳定版本:
GNU Compiler Collection(gcc、g++ 和 gfortran),以及各个针对支持的 IBM POWER® 处理器而优化的 gcc 运行时
GNU C 库 (glibc),单独针对支持的 POWER 处理器而进行了优化
GNU 二进制实用程序 (binutils)
十进制浮点库 (libdfp),进行了优化,添加了对基于 IBM POWER7® 和 IBM POWER8™ 处理器的服务器的硬件 DFP 支持
AUXV 库 (libauxv)
GNU 调试器 (gdb)
性能分析工具(oprofile、valgrind 和 itrace)
多核利用库(Intel® TBB、Userspace RCU),从 5.0-3 版本开始
以及多个支持库(比如 libhugetlbfs、zlib 等)
有关下载 toolchain 的信息,请参阅本文末尾的参考资料节。
出于本文的目的,我们将主要介绍 toolchain 交叉编译器。本文介绍如何使用 toolchain 交叉编译器,在 x86 服务器上构建适合 PowerLinux 的二进制可执行程序。文中还回答了以下问题。
在 x86 平台上构建的交叉编译应用程序,执行性能有在 PowerLinux 上原生构建的二进制程序那么好吗?
在 x86 平台上构建的交叉编译应用程序和库,是否拥有与在 PowerLinux 上构建的应用程序相同的应用程序二进制功能?
在 x86 平台上构建的交叉编译应用程序,是否会生成可在 PowerLinux 上执行原生调试的二进制程序?
为了回答这些问题,我使用了两个流行的开源应用程序 PostgreSQL 和 Apache httpd 服务器。PostgreSQL 和 Apache httpd 源代码发行版都是在 x86 服务器上使用 toolchain 交叉编译器来构建的,而且在 PowerLinux 服务器上是原生构建的。然后,这些应用程序被安装在一个 PowerLinux 服务器上的不同安装目录中并运行。我对这些应用程序运行了两个基准测试工具,比较了它们的性能和功能。
测试的结果将在以下各节中介绍。对于对重新创建测试感兴趣的读者,环境和配置 和 使用 toolchain 构建应用程序 节中分别介绍了环境配置和如何构建这些应用程序的信息。
结果为了测试这些应用程序,我使用了一些公开的基准测试工具。对于 PostgreSQL,我使用了来自 GitHub 的 pgbench-tool。它使用了 PostgreSQL 源代码发行版随带的 pgbench 工具。对于 Apache httpd,我使用了 Apache httpd 源代码发行版随带的 apache bench (ab) 工具。请查阅本文底部的参考资料节,了解下载 pgbench-tools 的地方的信息。
PostgreSQL 测试设置和结果在 x86 服务器上使用交叉编译器构建 PostgreSQL 应用程序后,完整的二进制程序集合被转移到一个 PowerLinux 服务器上。我们对默认的配置文件进行了以下修改:
Postgresql.conf max_connections = 4096 shared_buffers = 2048MB synchronous_commit = off checkpoint_segments = 3 checkpoint_timeout = 5min
修改 PowerLinux 系统设置的 kernel.sem 值。
sysctl.conf kernel.sem = 250 32000 32 12288
修改 pgbench-tools 的配置文件
MAX_WORKERS="32"。
根据 pgbench-tools 网站中的介绍,PostgreSQL 测试按照以下步骤运行:
创建 pgbench 和 results 数据库。
初始化 results 数据库。
创建一个包含描述的测试集。
使用 runset 脚本运行测试。
编译并提交测试结果。
有关执行这些步骤时使用的具体信息,请参阅 pgbench-tools 自述文件。
Postgresql 结果(交叉编译)
以下是在 Power 服务器上对交叉编译的二进制程序运行 pgbench-tools 的结果。
图 1. 交叉编译的 PostgreSQL 二进制程序的比例系数