面向服务的架构(SOA)是一种软件设计典范,可使无所不在的通信跨越不同企业,连接众多的平台和设备,从而使基础结构更加灵活。SOA的流行是围绕可扩展标记语言(XML)用于定义元数据的业界标准化取得巨大成功的结果,也是致力于使用XML在Web services (WbS)标签下开发新一代中间件的结果。
大部分主要软件解决方案提供商都已采用Web services产品、应用程序平台套件产品(如BEA WebLogic Platform 8.1)将来自多个开发商的产品跨越不同企业无缝地集成在一起。这种方法有利于“新”、“旧”软件更好地集成。在这一点上,采用SOA三个领域中具有重要的意义:企业应用程序集成(EAI)、企业对企业(B2B)集成和最近的移动软件解决方案。SOA简化了硬件和软件构建模块的组合,以适当的粒度提供适当的业务服务。这允许企业既可以增加Intel Itanium 2系列处理器的数量又可以向外扩展到Intel Xeon处理器。采用SOA的解决方案还会淡化服务器与客户端之间的区别,从而使所有可连接设备在企业计算环境中做出有价值的贡献。
基于SOA的解决方案的基础不断扩大,为激增的无线设备带来好处。在应用程序间传递XML数据为SOA提供了基础,还允许设备以不可分割的方式交换信息,并将灵活的计算扩展到传统办公环境的边界之外。
硬件和软件的发展可以进一步促进向SOA的转换,这既需要原始速度方面的性能,又需要具有处理不断增大的数据量的能力。Intel Itanium系列处理器允许大量内存直接寻址,从而提高了运算能力,同时还能提供企业级的可靠性、可用行和可伸缩性。
除硬件性能外,SOA还需要能够充分利用可用性能的执行环境。BEA的WebLogic JRockit是一种企业Java虚拟机(JVM),它采用完全64位的功能,提供出色的性能。BEA WebLogic JRockit利用极富创造力的代码性能和自适应最优化,连同创新的可伸缩自适应垃圾收集器,确保在Intel Itanium 2体系结构上实现最佳性能。
企业 Java和64位寻址
特别是服务器应用程序,倾向于利用大量可用内存。企业Java应用程序倾向于访问大量数据,因此大地址空间可以显著降低磁盘访问的次数。此外,大内存还允许对从网络访问接收的数据进行缓存,从而也能潜在地降低网络流量。业内领先的基准(如SPECjbb2000)在64位体系结构(如Intel Itanium 2微处理器)上表现得更好(参见表1)。
| 硬件厂商 |
硬件系统 |
JVM名称 |
CPU# |
结果 |
| Fujitsu Limited(富士通有限公司) |
PRIMEPOWER2500 |
HotSpot 64位Server VM在Solaris/SPARC 1.4.2版上 |
112 |
1420177 |
| Hewlett-Packard(惠普) |
HP Integrity Superdome Server (Itanium 2 6M) |
HotSpot 1.4.2.00(64位)在HP-UX 11i v2 for Itanium 2上 |
64 |
1008604 |
| Fujitsu Limited(富士通有限公司) |
PRIMEPOWER2500 |
HotSpot 64位Server VM在Solaris/SPARC 1.4.1_02版上 |
64 |
835479 |
| Hewlett-Packard(惠普) |
HP Superdome Server |
64位Server VM 1.4.0.01在HP-UX 11i for PA-RISC 8700+上 |
64 |
614358 |
| Sun Microsystems |
Sun Fire 15K |
HotSpot 64位Server VM在Solaris/SPARC 1.4.0_01版上 |
104 |
602270 |
表1业界领先的基准(如SPECjbb2000)在64位体系结构(如Intel Itanium 2微处理器)上表现得更好。(数据来源:Standard Performance Evaluation Corporation(标准性能评测公司)[SPEC] specjbb2000评测结果。)已发布的specjbb2000结果的前10名都是在64位处理器上取得的。这里列出了前五位。
Java应用程序将对象分配到堆,通常具有较高的对象分配速率。堆用完时,就要进行垃圾收集,以便释放堆空间,使应用程序继续运行。许多大型Java应用程序都得益于拥有较大的堆,因为这可以降低垃圾收集的开销,并且还允许JVM更加灵活地查找较小的插入点,以便在其上收集垃圾。
此外,还常常可以从运行一个以上应用程序的平台上获得更高的性能。例如,在单个系统中创建三层设置是可能的,方法是在单个平台上运行Web服务器、应用程序服务器和数据库。这种设置在具有较大内存的系统中将执行得更好。通过群集运行应用程序的多个实例也是可行的。大内存可使每个Java应用程序的实例都有较大的堆空间,因此能够从降低垃圾收集开销中得益,进而提高应用程序的整体性能。
在典型的设置中,有数台运行应用程序服务器的计算机全部通过网络连接到一台强大的后端数据库。在数据库成为瓶颈时,这种系统的性能通常依赖于数据库系统的饱和程度。要解决此问题,可以在应用程序服务器容器中使用缓存。自然,在具有大内存的64位系统中,这样更加有效。
企业 Java与Intel Itanium 2微处理器
如果可以使用多个64位处理器,Intel Itanium处理器系列可为企业Java应用程序带来许多引人注目的优点。企业 Java应用程序需要高可靠性和24x7的可用性。Itanium 2微处理器上的RAS(可靠性、可用性、可服务性)特性可与多种其他服务器处理器相比,参见表2所示。如表中所述,Intel Itanium 2微处理器可以提供比任何其他服务器微处理器更强的错误检测、错误纠正和错误恢复功能。
| 功能 |
Itanium 2 |
IBM Power |
Intel Xeon MP |
Sun Ultra-Sparc |
Opteron |
| 对数据总线的错误恢复(ECC) |
X |
X |
|
X |
|
| 内部软错误逻辑检查 |
2005 |
2004 |
|
|
|
| Lockstep支持 |
X |
|
X |
|
|
| 错误数据内嵌 |
X |
X |
|
|
|
| 缓存可靠性(Pellston) |
2005 |
X |
|
|
|
| 内存SDEC、双位重试 |
X |
X |
X |
X |
X |
| 内存节约 |
X |
X |
X |
X |
|
| 分区 |
X(节点) |
X(核心) |
X(节点) |
X(节点) |
|
| 电隔离分区 |
X(节点) |
|
X(节点) |
X(节点) |
|
表2几种服务器微处理器之间的RAS特性比较(按照本文发布时各开发商的可用产品文档)。
Itanium 2处理器系统总线将几种高级数据完整性功能集成到一起,可以提高错误检测和错误纠正能力。 Itanium 2处理器系统总线使用错误纠正代码(ECC),可以纠正单个位得错误、检测双位错误、发送中毒数据,并可检测所有仅限于半字节(4位)的错误。系统设计人员也可以选择将相同的ECC代码用于其他系统级缓存、主内存阵列或I/O子系统缓冲区中。此外,双位奇偶校验码还可以保护地址总线。
总之,基于Itanium 2的解决方案可以赶上甚至超过先前成本较高的专用体系结构系统所提供的可靠性特性。基于Itanium 2的系统可以通过较低的成本提供这种可靠性,同时还能提供多种操作系统选择和广泛的生态体系合作伙伴支持。
增加处理器数量带来的性能可伸缩性是令人满意的,因为通常情况下,增加平台上处理器的数量要比更改为新的、更加强大的平台破坏性低。由于性能要求的不断提高,向已部署的系统中增加更多处理器的能力必不可少。无论是在产品中还是对于通过集群组成得其他产品,Intel Itanium 2处理器都可以提供非凡的处理器可伸缩性。数据总线与内存之间的高带宽和大型片载缓存可以在单一平台上实现性能的线性提升。对于企业 Java应用程序,具有4个处理器的基于Intel Itanium 2的系统,其性能在通常情况下是单处理器系统的4倍。
Intel Itanium 2微处理器具有6 MB的片载缓存,并且很快即可提供更大的缓存。除了可以去除来自前端总线(数据总线与内存之间的总线)的数据流量来提高处理器的扩展以外,片载缓存还可以减少由于处理器等待内存而无法执行指令的时间。企业应用程序确实拥有数量可观的工作数据,而在这些大型片载缓存中可以轻松容纳相当大的工作数据集,从而可以实现更高的性能。
程序操作码通常保留在寄存器中,当操作码的数量超过寄存器的数量时,当前不需要的操作码就会通过两种方式被传输到内存中:通过内存存储操作的显式方式或者通过将这些操作码移动到堆栈的隐式方式。在很多平台上,这会加重缓存和内部数据路径的压力,并且还要插入很多附加指令才能移动这些操作码。Intel Itanium处理器系列的架构中已经包含128个通用寄存器和128个浮点寄存器,为包含大量操作码的服务器工作负荷提供了足够的空间。
基于Intel Itanium 2的系统利用显式并行指令计算(EPIC)功能,超越了常规处理器体系结构的顺序访问特性。应用程序通过编译器与处理器进行显式通信,其操作可以并行完成,这样可使整体使用效率更高。通过使用预测技术,降低分支指令和分支指令预测失败的次数,还可以进一步提高性能。Intel Itanium 2处理器系列通过使用数据和控制推测(这些功能可以帮助隐藏与内存相关的处理器停顿)以便编译器提高性能,从而提供额外的稳定性级别,并提高整体可靠性和性能。
挑战与问题
Java的流行是因为它与平台无关,在一个平台上开发的应用程序也可以部署到任何其他平台。应用程序以隐式方式依靠JVM来提供针对平台得优化性能。代码生成、线程管理、内存分配和垃圾收集都是Java应用程序性能的重要方面,因此JVM处理这些方面的方式就是一个关键的性能区别。
Intel Itanium处理器系列使用EPIC体系结构。这种体系结构的关键特性是多个指令组成几个指令束,可以在同一时钟周期内发出这些指令束以便执行它们。编译器控制用于识别可以组成指令束的指令的质询,以便充分利用这种并行机制。计算机的性能始终取决于所生成代码的质量和基础硬件快速使用代码的能力。
伴随预期优势而来是任务的增加,使用Intel Itanium体系结构,编译器的任务可能会比其他平台上更多,因为EPIC概念允许编译器大量占用更多的空间,以便从这种体系结构中获益。
Java的首要问题是,代码生成是应用程序执行的一部分。对于Java,虽然编译器生成正确代码非常重要,但迅速生成代码也是重要的。速度较慢的代码生成器会对应用程序性能造成负面影响。此外,启动应用程序的较长延迟也是令人不快的。
在编译器中,代码调度程序是关键组件。它需要查看可用指令,然后决定哪些指令能够绑定到一起。显然,代码调度程序能够查看的指令越多,找到适当指令的几率越大,也就越能从代码并行机制中受益。“范围”(即代码调度程序能够查看的代码数量)也是影响应用程序性能的一个重要因素。
Java代码通常由大量的类和方法组成,大多数方法一般都很小。这样就会极大地限制调度程序可以查看的范围。JVM需要找到能够扩展这一范围的方法。JVM还必须能够高效地处理大量方法。例如,在SPECjAppServer2002基准中共有大约10,000种方法,没有一种方法能够使用超过3%的执行时间。
内存管理器也有必须面对的问题。虽然具有较大的堆对性能有益,但为了使堆管理算法伸缩自如,这也加重了JVM的负担。虽然始终都有堆碎片的问题,但在堆较大时,这一问题就很严重了。
编译器和优化器
为了实现快速启动,许多JVM选择在开始时首先解释Java字节码,在随后运行时再对这些字节码进行编译。然而,JRockit首先使用JIT(Just In Time)编译器编译代码。虽然启动时间稍长,但这样可以使应用程序能够从一开始就提高性能。为了实现快速启动,WebLogic JRockit不使用所有可能的编译器优化。虽然使用所有编译器优化可能会在应用程序执行的初始阶段获得较高性能,但在启动时间上的额外延长也被认为是不必要的。
从应用程序性能的角度考虑,使用所有优化去编译所有方法也是不必要的,因为编译时间也是应用程序执行时间的一部分。因此,不仅WebLogic JRockit不会在启动时完全优化所有方法,而且在整个应用程序运行期间,也会保留大量的方法不被优化。WebLogic JRockit仅选择改进后能够最大限度地提高应用程序性能的函数,然后仅对这一少部分方法进行优化。
WebLogic JRockit有两个各不相同但可以协同操作的代码生成器:JIT编译器和优化编译器。如图1所示。大多数方法只能遍历图表的左半边。某些选择方法将会利用优化编译器。
图1. BEA WebLogic JRockit有两条代码编译途径。
WebLogic JRockit使用尖端的、低开销的、基于采样的技术来识别应该优化的函数。JVM包含一个采样器线程,该线程以周期性间隔唤醒,并检查几个应用程序线程的状态。它会识别每个线程正在执行什么方法,并记录某些执行历史纪录。采样器线程为所有方法跟踪此信息,当它发现频繁使用某一方法时,就会打上标记以便进行优化。在应用程序运行期间,较早的阶段会有大量这种优化机会,随着应用程序的继续执行,优化机会出现的速率不断下降。
由于方法的大小通常很小,而范围对代码调度程序非常重要,因此内嵌方法的优化是最重要的。调用方法的代码直接在调用点插入。在Java中,这可能很难完成,原因有很多,如在执行期间开始前,接口调用、远程调用和虚拟调用中被调用函数的标识未知。WebLogic JRockit拥有现成的技术,能够解决一部分问题。如果完成情况很差,则内嵌方法可能会导致代码膨胀,进而造成性能急剧下降。WebLogic JRockit包含精心调试过的启发式,可以防止这种性能下降。
WebLogic JRockit中的优化编译器包含许多基于Intel Itanium 2微体系结构的众所周知的代码生成技术。这些技术包括尖端的寄存器分配器,它可以充分利用Intel Itanium处理器系列的大寄存器堆栈(128个通用寄存器和128个浮点寄存器)。
内存分配和垃圾收集
WebLogic JRockit的堆管理策略可以随线程数和堆空间大小一同缩放。内存分配通过线程本地数组完成;在堆上为每个线程分配约1000个对象的空间。这种方案可以提升数据的空间位置和临时位置,从而实现处理器缓存的高性能。还会大大降低线程间的同步,以便获得可分配给对象的堆空间。线程本地数组的大小是性能的重要参数,最佳大小取决于应用程序。WebLogic JRockit包含相应的启发式,可在应用程序执行期间对该参数进行调试。
WebLogic JRockit包含多种垃圾收集器,不同的应用程序可获益于不同的收集器。JVM包含相应的启发式,可以按各自适应方式为每个应用程序找到最佳的垃圾收集算法。所有的垃圾收集器在设计上都可以正确处理大型堆,算法可以利用堆中数据稀疏这一优势——即堆中包含的大多是由寿命短的对象形成的垃圾。
对垃圾收集器加以区分,根据是它们是否包含苗圃(代)、标记阶段是否多线程、扫除阶段是否多线程,以及收集器是与应用程序并发运行还是在进行垃圾收集期间停止应用程序。这些选择可以影响垃圾收集的频率和每次垃圾收集的持续时间(或暂停时间)。对于最大应用程序吞吐量,应该选择最小化总垃圾收集时间(垃圾收集频率的结果)和每次垃圾收集平均持续时间。但是在很多应用程序中,响应时间也是非常重要的,在这些情况下,必须确保暂停时间最小。WebLogic JRockit允许用户指出应用程序最重要的要求(响应时间或吞吐量),然后WebLogic JRockit将选择能够实现所选目标的垃圾收集方法。
碎片可能会成为严重的性能问题,尤其是在大型堆空间的情况下更是如此。在垃圾收集期间压缩堆空间将会解决这一问题,但会影响性能,因为压缩大型堆空间开销太大。避免压缩也有问题:堆的部分空间将无法使用,从而导致频繁进行垃圾收集。同样,位置也会影响处理器缓存的性能。
WebLogic JRockit使用滑动压缩窗口解决了这一问题。在每次垃圾收集期间,每次压缩堆的一个不同的小部分。在窗口大小适当的情况下,堆的性能与完全压缩一样好,而垃圾收集的开销却与不压缩一样小。
当SOA Java开发人员将他们的应用程序部署到使用JRockit的、基于Intel Itanium 2微处理器的平台上以后,既可以提高运算能力,同时又能获得所需的性能和可靠性。机不可失,马上使用这种技术吧!您最终会获益匪浅。
Itanium是Intel公司或其子公司在美国及其他国家的商标或注册商标。
原文出处 http://www.fawcette.com/weblogicpro/2004_05/magazine/features/kshiv/
| 作者简介 |
|
Christopher S. Thomas是Intel公司Solutions Channels Group中的首席电子商务战略专家(Chief e-Strategist)。 |
|
Guru Nagarajan是一名Intel Solution Services的分布式解决方案部门专攻分布式系统的架构师。 |
|
Kumar Shiv是Intel公司的一位高级性能架构师(Senior Staff Performance Architect),在软件与解决方案集团的Managed Runtime Environments小组工作。 |
|