Linux on POWER:发行版迁移和二进制兼容性考虑事项(2)
- UID
- 1066743
|
Linux on POWER:发行版迁移和二进制兼容性考虑事项(2)
NUMANon-uniform Memory Access (NUMA) 是针对 Linux on POWER 在 2.6 内核中引入的,这个特性在 RHEL5 和 SLES10 的最新版本中得到进一步优化。NUMA 解决了系统中的某些处理器因为总线位置不同到达特定内存区域的时间要比其他处理器长的问题。NUMA 通过在每个总线使用更多内存总线和更少处理器来减少系统共享内存总线的争用。尽管这在包含少量处理器的系统中作用不明显,但它能够在系统包含大量处理器时改善性能。
在 Linux 2.6.15 内核中,NUMA 优化通过指定仅本地处理器能够访问内存,从而改进了跨大型系统(处理器核在 4-8 个以上)运行的工作负载的性能。如果处理器正在查找存储在相邻的 cell board 上的内存中的数据,Linux 2.6.16 内核能够获取该信息并将其移动到本地内存中(运行速度更快),然后在本地内存中执行所需的操作,而不需重新启动该操作。
由于 POWER5 和 POWER6 架构能够扩展到 64 位处理器,大部分应用程序都得益于 2.6 内核级别的 NUMA 支持。设法提高性能的应用程序可以使用 user-land NUMA API。RHEL4 附带了 user-land NUMA API,以及更多关于如何在 NUMA Group 主页使用这些 API 的信息
使用 Linux 2.6.16 内核时,必须根据共享内存的分配方式进行一些更改。如果处理器正在查找存储在相邻的 cell board 上的内存中的数据,Linux 2.6.16 内核能够获取该信息并将其移动到本地内存中(运行速度更快),然后在本地内存中执行所需的操作,而不需重新启动该操作。
编译器改进您可以考虑重新编译以利用 Linux on POWER 的最新编辑器的新特性带来的性能优势。现在,高性能编译器 IBM XL C/C++ Version 8 可以在基础级别的 RHEL4、SLES9 和 SLES10 上使用。IBM XL C/C++ Version 9 可以在 RHEL5 及其更新、SLES10 SP1 和 SP2 上使用。Version 9 添加了针对基于 POWER6 处理器的系统的性能改进。
-qarch 和 -qtune 选项用于为各自的架构优化性能。例如,要优化 POWER6 的性能,使用 -qarch=pwr6 和 -qtune=pwr6。此外,还引入了 -qtune=balanced 选项。这个选项与 -qarch=pwr5(或 pwr5x)一起使用时,将生成可以在 POWER5 和 POWER6 系统上运行的二进制文件,但包含能够改进 POWER6 性能的调度改进。Version 9 还包含对 AltiVec Vector Multimedia Extensions (VMX) 的支持,VMX 最初是在 IBM PowerPC 970 处理器上提供的,现在通过 -qaltivec 选项整合到 POWER6 产品系列。
GNU Compiler Collection 包含针对多种不同语言的编译器。版本 3.3 到 4.1 得到了改进,包括对其 C 编译器 gcc 的特定于 POWER6 的优化。-mcpu=power6 和 -mtune=power6 标志现在得到支持,从而导致出现针对 POWER6 架构的注册表使用和指令调度参数。此外,还包含针对 IBM PowerPC 970 和 IBM POWER6 处理器的 VMX 向量扩展,它们能够提升向量化代码的性能。尽管这些优化选项在各自的架构上改善了性能,但它们可能损害应用程序在其他平台上的二进制兼容性。
SMT当迁移到基于 2.6 的 Linux 内核时,Simultaneous Multi-threading (SMT) 还可以提供另一项性能收益。SMT 在 POWER6 上得到支持,并且大大改进了多线程应用程序的性能。POWER6 处理器有两个能够在每个处理器周期发出多条指令的硬件指令线程,从而改善了性能。不过,SMT 可能损害线程不是很多的应用程序的性能。可以在 Linux 内核启动时向其传递 smt-enabled=off 禁用 SMT。
其他 2.6 内核改进2.6 内核在 RHEL4 和 SLES9 中引入了以下性能改进,并且在 RHEL5 和 SLES10 版本中得到进一步改进:
- 可以扩展到 64 位 SMP POWER6 处理器的可伸缩性。
- 对内存密集型应用程序的大页支持,允许 16MB 的页大小,同时也提供传统的 4KB 页大小。
- 在 Red Hat Enterprise Linux 5 中引入 64KB 的页大小。
- 虚拟内存子系统改进,包括在内存压力比较大的系统中提供的反向映射算法。
- 块 I/O 和异步 I/O 改进。
从 RHEL4 迁移到 RHEL5Red Hat 在 RHEL4 和 RHEL5 之间维护了一个稳定的 ABI,因此可以在这两个版本之间顺利地迁移应用程序。不过,为了确保二进制兼容性,Red Hat 建议您将您的应用程序接口链接到它们所定义的核心库。核心库列表包括:
- libc、libgcc、libstdc++、libdl、libm、libutil、libcrypt、libz、libpthread 和 libncurses
- libX11、libXext、libXt、libICE、libSM 和 libGL
- libgtk、libgdk、libgdk_pixmap、libpango、libatk、libglib、libgmodule、libgthread、libgnomeprint、libgnomeprintui、libgconf 和 libglade
在文章 “Red Hat Enterprise Linux 4 Application Compatibility” 中讨论了核心库和其他兼容性问题。尽管这个文档阐述的是 RHEL4 中的兼容性,但其中的概念和理念适用于 RHEL5 中的应用程序兼容性问题。使用核心库之外的其他库的应用程序仍然可以实现兼容性,但需要进一步执行回归测试。应用程序不保留二进制兼容性的情况包括,应用程序静态地链接到其他库、依赖内核级别接口,或与 POSIX 标准或 64 位 POWER ABI 定义冲突。
不仅 ABI 在 RHEL4 和 RHEL5 之间保持稳定,并且 RHEL5 中的许多其他 2.6 内核特性也与 RHEL4 兼容。这就允许 RHEL4 应用程序现成地利用 RHEL5 中包含的 Simultaneous Multi-threading (SMT) 和 Native Posix Thread Library (NPTL) 等特性获得性能改进,而不需要重新编译它们的源代码。这些应用程序还可以利用 2.6 内核中的性能改进,如本文前面所述。
不过,在 RHEL5 中的以下两方面进行重新编译能够改进应用程序的性能:
- 对于包含大量处理器的系统,在 RHEL5 中重新编译 NUMA user-land API 会提高性能(如果还没有在 RHEL4 中进行编译的话)。尽管从总体上看应用程序都能够从内核级别 NUMA 支持获得性能改进,但是重新编译这些 user-land API 还可以获得进一步的性能改进。处理器密集型和内存访问频繁的应用程序将获得最大收益,因为 NUMA 减少了处理器访问内存区域的时间。
- 使用 RHEL5 中的最新编辑器进行重新编译时,其他应用程序也可能获得性能改进。这些编译器添加了利用 POWER6 优化的标志,如本文前面所述。
当重新编译应用程序以改善性能时,必须考虑可能损害二进制兼容性的风险。不过,在大部分情况下,将应用程序从 RHEL4 迁移到 RHEL5 时不需要额外的工作。
从 SLES9 迁移到 SLES10从 SLES9 迁移到 SLES10 也是比较顺利的。尽管在 SLES9 中引入了 NPTL 线程模型(不再使用旧的 LinuxThreads 模型),但 NPTL 是 SLES10 中唯一支持的线程模型,因为 Glibc 库不再支持 LinuxThreads。在 “小节描述了更改线程模式导致的问题,解决了从一个线程模式改用另一个线程模式出现的问题。尽管使用更少通用库的非线程应用程序能够更好地维护 SLES 版本之间的二进制兼容性,但必须执行回归测试以确保质量。
对于 RHEL,在某些情况下重新编译源代码可能有利于将要在 SLES10 上运行的应用程序。例如,通过利用 SLES10 中的改进编辑器可以提升应用程序的性能。SMT 也是 SLES10 中的一个新特性,它能够提升包含大量线程的应用程序的性能。
一般而言,大部分非线程应用程序都不会遇到 SLES9 和 SLES10 之间的二进制兼容性问题。不过,在对库和内核版本进行了主要修改之后,最好重新编译源代码,以让应用程序获得最佳的性能。 |
|
|
|
|
|