对于绝大多数部署在高性能服务器上的应用来说,大量的并发操作是不可避免的。在相关配置参数未经过充分调优的情况下,即使有时系统资源的利用率并未达到峰值,在增加工作负荷的同时,系统资源的利用率却仍未得到提高。所以为了确保服务器有能力处理与其处理器性能相匹配的高工作负荷,需要针对最大并发量进行调优。
值得注意的是,更多的并行处理意味着对服务器资源(例如内存和线程数)的更高需求,这就需要同时协调其他的调优目标,例如对大对象的处理,应对大规模用户,提供快速反应等等。为优化在最大并发量下的操作,我们在调优过程中需遵循这一指导方针——沿着执行流程,逐个去除瓶颈。
回页首
在多并发环境中对边缘组件 (Edge Component) 进行调优
首先对结合业务场景,按照边缘组件的绑定的不同,分别加以描述与分析。
1 Java 消息服务 (Java Message Service, JMS) 绑定和 MQ 绑定
3 企业信息系统 (Enterprise Information System, EIS) 绑定
然后按照边缘组件处理的业务对象的来源,分别介绍调优相关的参数和配置。
2 如果输入业务对象来自 J2EE 连接器架构 (Java EE Connector Architecture, JCA) 1.5 资源适配器(非 SIB JMS 资源适配器)
4 如果输入业务对象来自对象请求代理 (Object Request Broker, ORB) 请求
边缘组件主要是指导出 (Export) 和导入 (Import) 组件。导出组件定义了一个模块的外部接口,从而使得该模块的服务组件架构 (Service Component Architecture, SCA) 组件可以为外部客户端提供服务。导入组件定义了一个针对模块外部服务的接口,通常被 SCA 组件用来调用采用了 SCA 编程模型的外部服务。 图 1 是在 WebSphere Integration Developer 业务集成界面上的一个名为 PerformanceTuningTest 的模块实例,图 1 中绿色实线框内的组件均为导出组件,红色虚线框内的组件均为导入组件。
图 1. 模块实例 PerformanceTuningTest
在多并发环境中,首先需要确保 WPS 的边缘组件并发地接收,发送和处理业务对象。本节首先按照绑定方式的不同,结合真实的业务场景分别介绍边缘组件调优需要涉及到的配置信息;但由于这些绑定涉及到的配置信息互有重叠,本文将在后面的章节对这些配置信息按照处理的数据对象的不同加以分类介绍。
1 Java 消息服务 (Java Message Service, JMS) 绑定和 MQ 绑定
JMS 绑定共有三种,分别是 JMS1.1 绑定 , 通用 (Generic) JMS 绑定和 WebSphere MQ JMS 绑定。JMS 绑定、 MQ 绑定与后面即将介绍的 HTTP 绑定统称为消息绑定 (Messaging Binding) 。图 1 中包括了这里提到的四种绑定的导入、导出组件。
在请求 – 响应方式下,导出和导入组件都会涉及到接收,处理和发送消息的操作。首先,如何在大量外部服务请求消息并发到达的情况下高效地进行接收是决定多并发环境性能的关键要素。导出、导入组件通过消息驱动 Bean (Message Driven Bean, MDB) 来监测请求、响应消息的到达。按照绑定方式的不同,可采用不同的配置方式决定 MDB 并发能力的高低。在图 2, 3 中,绿色虚线框内描述了不同绑定中消息接收的工作原理和相应实现。
如图 2 所示,对于 JMS 绑定,JMS 激活规范 (JMS Activation Specifications,ActivationSpec) 被用来绑定 MDB 和驱动 MDB onMessage() 方法的消息队列,以及定义一系列 MDB 相关参数。所以为提高并发接收消息的能力,需要对 JMS 激活规范进行配置。图中粉色五边形代表了 JMS 绑定导入、导出组件相应的激活规范(命名规范详见蓝字),灰色长方形代表了 MDB 监听的服务集成总线 (Service Integration Bus,SIBus) 上的目标 (Destination) (命名规范详见蓝字)。具体调优过程和参数详见后文 配置 JMS 激活规范 部分。
图 2. JMS 绑定导入 / 导出组件接收 / 发送消息原理图
对于 MQ 绑定, MQ JMS 绑定和通用 JMS 绑定,MDB 的侦听器端口 (Listener Port) 被用来实现与 JMS 激活规范类似的功能,同理也需要对侦听器端口进行调优。需要注意的是在使用侦听器端口来定义 MDB 的情况下,还需要对相应的 JMS 连接工厂 (Connection Factory) 进行配置,以保证为所有 MDB 线程提供到 JMS 提供程序 (JMS Provider) 的连接,例如默认消息提供程序 (Default Messaging Provider) 、 WebSphere MQ 消息提供程序 (MQ messaging provider) 等。图 3 中橙色正方形代表了 MQ 、 MQ JMS 、通用 JMS 绑定导入、导出组件相应的侦听器端口(命名规范详见蓝字);灰色长方形代表了 MDB 监听的 MQ 或其他 JMS Provider 上的目标(命名规范详见蓝字);黄色圆形代表了连接工厂(命名规范详见蓝字)。对侦听器端口和连接工厂的具体调优过程和参数详见后文中 配置侦听器端口 和 配置 JMS 和 JMS 队列连接工厂 部分。
图 3. MQ, MQ JMS, Generic JMS 绑定导入 / 导出组件接收 / 发送消息原理图
根据业务需要有时要将响应 / 请求消息发送给外部服务。如图 2 和 3 中红色虚线框中描述的那样,导入 / 导出组件通过连接工厂连接到 MQ 或 JMS 提供程序。以导入组件为例,对每一个消息绑定导入组件,根据开发时选择配置新消息提供程序资源或指定已经配置好的消息提供程序资源,在部署应用程序过程中会生成一个连接工厂,或指定已配置好的连接工厂。该 JMS 连接工厂连接池的最大连接数属性应该足够大,以保证为导入组件中并发执行的所有发送消息的线程提供连接。同样,对连接工厂的具体调优过程和参数详见 配置 JMS 和 JMS 队列连接工厂 部分。
通过对 MDB 的激活规范,侦听器端口和连接工厂进行调优,导出 / 导入组件可以实现并发接收和发送消息,接下来的瓶颈则是如何对这些消息进行并发的处理,也就是要求多个 MDB 线程并发运行。这就需要对 MDB 的线程池进行调优,包括对默认线程池的调优,和专用线程池的设置。具体的调优参数详见后文。
针对 SOAP/HTTP Web Service 绑定和 HTTP 绑定,调优的重点应该放在网络容器 (Web Container) 的线程池 (Thread Pool) 上,从而保证能提供足够的线程对请求进行处理。具体的调优参数和指导详见后文 如果输入业务对象来自 HTTP 调用 部分。
针对 SOAP/JMS Web Service 绑定,由于它的底层传输协议是 JMS ,所以对 SOAP/JMS Web Service 绑定边缘组件的调优与针对 JMS 绑定的调优类似。在部署含有 SOAP/JMS Web Service 绑定边缘组件的应用过程中,默认生成 JMS 队列 jms /< 导出组件名 >,用于监听这个队列的 MDB ,相应的 JMS 激活规范,以及队列连接工厂。对这些配置的调优建议详见后文中 配置 JMS 激活规范 和 配置 JMS 和 JMS 队列连接工厂 部分。
3 企业信息系统 (Enterprise Information System, EIS) 绑定
当使用外部 JCA 资源适配器的时候,EIS 绑定可以帮助调用 EIS 上的服务 / 资源或使您的服务对 EIS 可用。 JCA 资源适配器使用 J2C 激活规范来配置特定 MDB 实例,使用 J2C 连接工厂在运行时创建出站连接实例。所以针对 EIS 绑定边缘组件的调优重点在 J2C 激活规范和 J2C 连接工厂上,配置界面如后文中 配置 J2C 激活规范 和 配置 J2C 连接工厂 所示,但是具体的调优参数请参考 JCA 资源适配器调优相关文档。
对于同步 SCA 调用,在 SCA 模块的部署过程中,将为该模块生成一个用于为服务请求者提供同步调用接口的无状态会话 (Stateless Session) Bean,以及一个指向它的名称的空间绑定 (Namespace Binding) 。所以对同步调用导出组件的调优主要关注处理 EJB 请求的线程池规模,详见后文 如果输入业务对象来自对象请求代理 (Object Request Broker, ORB) 请求 部分。
对于异步 SCA 调用,在 SCA 模块的部署过程中,将在 SCA.SYSTEM.<cell name>.Bus 上创建一些 SIBus 目的地,通常情况下是一系列队列,同时还会生成相应的 J2C 激活规范来配置监听这些目的地的 MDB 。所以,在多并发环境下,异步调用中的 SCA 绑定导入和导出组件,需要对 J2C 激活规范进行调优,从而保证更多的并发消息被 MDB 接收和处理。这里我们以一个业务场景为例简单描述异步调用 SCA 绑定边缘组件的工作原理和相应构件。
该业务场景由两个模块组成,Module1 采用异步回调方式调用 Module2。在部署这两个模块时,会在系统总线上自动生成 4 个目的地: SCA/Module1; SCA/Module2; SCA/Module1/importlink/Module1_SCABindingImport 和 SCA/Module2/exportlink/Module2_SCABindingExport ,以及两个 J2C 激活规范:Module1_AS 和 Module2_AS。
其中 SCA/Module1 和 SCA/Module2 均为模块队列,由 Module1_AS 和 Module2_AS 相关联的 SCA 模块 MDB 对其进行监听。灰色虚线部分代表了请求发送的路径,在部署期间,将会在 SCA/Module1/importlink/Module1_SCABindingImport 上创建缺省转发路由路径。从而在消息到达此目的地后,将消息自动转发到 SCA/Module2/exportlink/Module2_SCABindingExport,同样,SCA/Module2/exportlink/Module2_SCABindingExport 上也定义了缺省转发路由路径,因此在消息到达此目的地时,消息将被转发到 SCA/Module2 目的地。并由 Module2_AS 定义的 MDB 接收并处理该请求。该 MDB 从消息正文获取请求消息,并从消息头中获取目标服务名称。然后它将请求分派给某个 SCA 运行时 (runtime)。SCA 运行时处理消息并调用目标服务,如果存在任何响应,SCA 运行时将响应消息写回到存放在消息头中的响应目的地,在本业务场景中,即为 Module1 的模块队列 SCA/Module1。同样,Module1_AS 相应的 MDB 监听到了该响应,并进行后续的操作。从这个流程中可以看出需要进行调优的主要是 Module1_AS 和 Module2_AS。具体的调优参数及指导详见 配置 J2C 激活规范。由于 SCA 模块 MDB 是由该模块中所有组件共用的,本文在中间组件调优部分中还会对其进行详细介绍。
在 WPS 中, EJB 绑定只能应用于导入组件上。通过 EJB 绑定, SCA 模块能够通过 IIOP (Internet Inter-ORB Protocol) 协议调用运行在 J2EE 服务器上的基于 J2EE 的应用程序。被调用方应提供足够的线程来处理 EJB 调用请求。
JMS 激活规范的最大并发端点数 (Maximum Concurrent Endpoint) 决定了相应的 MDB 可以并发接收的消息数量。它的默认值是 10,这意味着同时可以有 10 个业务对象从 JMS 队列中被传递给 MDB 线程。如果需要并发处理 100 个,则需要将该值改为 100。但是值得注意的是,一个活跃的 MDB 实例在容器线程池中的一个线程上运行。
这里您可以使用 Tivoli Performance Viewer(TPV) 来检测最大并发端点数。对于每一个正在被 MDB 处理的消息,在队列中将有一个消息被标志为锁定在一个事物中(这个锁将在 onMessage() 方法完成时被移除),同时这些信息被标志为”不可用”。可以通过一个性能监控基础结构 (Performance Monitoring Infrastructure, PMI) 度量参数来查看每一个队列中不可用消息的数量(性能模块 > SIB Service > SIB Messaging Engines > 总线名 > Destinations > Queues),这被称为”不可用消息数 (UnavailableMessageCount)”。如果任一队列中存在至少与最大并发端点数相同数量的不可用消息,则意味着当前 MDB 的最大并发端点数限额已经成为瓶颈,此时,需要增大 MDB 的最大并发端点数。
图 5. 通过 Tivoli Performance Viewer 查看 PMI 不可用消息数
以下文章点击率最高
Loading…