[AIX Solaris HP-UX Linux Windows][IBM i]

对象请求代理调整准则

每当在工作负载中使用了对象请求代理 (ORB) 时,请使用本文档中的准则。

每当通过远程接口访问企业 Bean 时,都会使用 ORB。如果 CPU 使用率特别高或特别低,就可能表示下列其中一个参数值有问题。请对部署的每个应用程序检查这些核心调整参数。

线程池调整

大小

根据工作负载来调整 ORB 线程池的大小。由于线程还没有可供处理的工作,所以,请避免暂挂线程。如果线程还没有可供处理的工作,那么通过调用 Object.wait 方法(执行上下文切换)来消耗 CPU 时间。调整线程池大小,使线程的等待时间足够短,以防止他们由于空闲太长时间而被破坏。

线程池大小取决于工作负载和系统。在典型配置中,对于每个处理器,应用程序需要 10 个或更少的线程。

但是,如果应用程序正在执行非常慢的后端请求,例如对数据库系统的请求,服务器线程就会阻塞以等待后端请求完成。对于后端请求,CPU 使用率相当低。在这种情况下,增加负载并不能提高 CPU 使用率或吞吐量。线程转储指出几乎所有线程都已用于后端资源。在这种情况下,请考虑增加每个处理器的线程数,直到吞吐量有所提高并且线程转储指出线程除了用于后端调用以外还用于其他运行时部分为止。仅当正确调整后端资源后,才应该调整线程数。

允许线程分配超出最大线程数参数也会影响线程池大小,但除非后端系统长时间地停止,从而导致阻塞所有等待后端系统的运行时线程,而不是处理其他不涉及后端系统的工作,否则不要使用此参数。

可以在管理控制台中调整线程池大小设置。单击服务器 > 服务器类型 > 应用程序服务器 > server_name > 容器服务 > ORB 服务 > 线程池。您可以调整最小线程数和最大线程数。

线程池超时

通过 ORB 发出的每个入站和出站请求都需要使用 ORB 线程池中的一个线程。在负载较重或 ORB 请求嵌套较深的情况下,Java™ 虚拟机 (JVM) 有可能让 ORB 线程池中的所有线程都尝试发送请求。同时,处理这些请求的远程 JVM ORB 进程会让其 ORB 线程池中的所有线程都尝试发送请求。因此,永远不会取得进展,不会将线程释放回 ORB 线程池,并且 ORB 无法处理请求。因此,有可能出现死锁情况。使用管理控制台时,可以通过 ORB com.ibm.websphere.orb.threadPoolTimeout 定制属性调整此行为。有关更多信息,请参阅有关“对象请求代理”定制属性的文档。

片段大小

ORB 将消息划分成片段以通过 ORB 连接进行发送。可以通过 com.ibm.CORBA.FragmentSize 参数配置此片段大小。

要确定并更改通过 ORB 传送的消息大小以及必需的片段数,请执行以下步骤:
  1. 在管理控制台中,在“ORB 属性”页中启用 ORB 跟踪。
  2. 从“记录和跟踪”页中启用 ORBRas 跟踪。
  3. 由于跟踪可能会生成大量数据,所以请增大跟踪文件大小。
  4. 重新启动服务器,然后至少重复一次测试用例(最好重复多次)。
  5. 查看可跟踪的文件,搜索 Fragment to follow: Yes

    此消息表明 ORB 已传送了一个片断,但在整条消息到达之前,至少还有一个片段需要传送。Fragment to follow: No 值表明该特定片段就是整条消息的最后一个片段。如果整条消息能放在一个片段中,那么此片段也可以是第一个片段。

    如果转到 Fragment to follow: Yes 所在的位置,那么可以找到类似于以下示例的块:

    Fragment to follow: Yes
    Message size:       4988 (0x137C)
     -- 
    Request ID:         1411

    此示例表明片段中的数据量是 4988 字节,请求标识是 1411。如果搜索出现的所有 Request ID: 1411,就可以确定用来发送该特定消息的片段数。如果将所有相关消息大小进行累加,就可以得到通过 ORB 发送的消息的总大小。

  6. 可以通过设置 com.ibm.CORBA.FragmentSize ORB 定制属性来配置片段大小。

拦截器

拦截器是 ORB 扩展,它可以在 ORB 运行请求之前设置上下文。例如,上下文可能包含要导入的事务或活动会话。如果客户机创建了一个事务,然后将该事务上下文传送到服务器,服务器就会通过拦截器将该事务上下文导入到服务器请求中。

大部分客户机不会启动事务或活动会话,因此移除非必需的拦截器可以使大部分系统受益。

要移除拦截器,请手动编辑 server.xml 文件并从 ORB 部分中移除那些不需要的拦截器行。

调整连接高速缓存

根据应用程序服务器工作负载以及吞吐量或响应时间需求的不同,可能需要调整 ORB 连接高速缓存大小。连接高速缓存中的每个条目都是表示不同 TCP/IP 套接字端点的对象,该端点由主机名或 TCP/IP 地址以及端口号标识,ORB 使用该端口来将 GIOP 请求或 GIOP 应答发送至远程目标端点。连接高速缓存的用途是通过对后续请求或应答复用 ORB 连接对象来最大程度地缩短建立连接所需的时间。(对请求和相应的应答使用同一个 TCP/IP 套接字。)

对于每个应用程序服务器,连接高速缓存中的条目数与并发 ORB 连接数直接相关。这些连接由远程客户机发出的入站请求和应用程序服务器发出的出站请求组成。当服务器端 ORB 接收到连接请求时,它通过高速缓存中的条目来使用现有的连接,或者建立新连接并将该连接的条目添加到高速缓存中。

使用 ORB 的“最大连接高速缓存”和“最小连接高速缓存”属性来控制连接高速缓存在给定时刻的最大条目数和最小条目数。当条目数达到对“最大连接高速缓存”属性指定的值,并且需要建立新连接时,ORB 将创建所请求的连接,将条目添加到高速缓存中,然后在高速缓存中搜索最多 5 个不活动连接条目并尝试将他们移除。因为在移除不活动条目之前添加了新连接,所以,高速缓存条目数有可能暂时超出对“最大连接高速缓存”属性指定的值。

对于一个 ORB 连接,如果 TCP/IP 套接字流未在使用中,并且在该连接上进行的任何请求都没有暂挂的 GIOP 应答,那么认为该连接处于不活动状态。随着应用程序工作负载的降低,ORB 将关闭连接并从高速缓存中移除这些连接的条目。ORB 将持续地从高速缓存中移除条目,直到余下的条目数等于或小于对“最大连接高速缓存”属性指定的值为止。高速缓存条目数永远不会低于指定的“最小连接高速缓存”属性值,该属性值必须至少比指定的“最大连接高速缓存”属性值小 5。

由于只有少量连接是从客户端建立的,所以通常没有必要在客户端 ORB 中调整连接高速缓存。

JNI 阅读器线程

缺省情况下,ORB 使用 Java 线程处理它接收的进站连接请求。随着并发请求数的增加,大量阅读器线程耗用的存储器也会增加,在资源不充裕的环境中,这可能会成为瓶颈。最后,如果并发请求数超过系统的可用资源,那么创建的 Java 线程数可能造成内存已满异常。

为帮助定位这种潜在问题,您可以配置 ORB 以使用 JNI 阅读器线程(数量有限的阅读器线程,这些线程使用本机 OS 线程而不是使用 Java 线程在 ORB 初始化期间创建)。 JNI 阅读器线程依赖于本机操作系统 TCP/IP 异步机制,该机制使单个本机操作系统线程能够同时处理来自多个套接字的 I/O 事件。ORB 对 JNI 阅读器线程的使用进行管理,并使用轮询算法来指定其中一个可用线程处理连接请求。通常情况下,只能当使用 Java 线程对于您的应用程序环境来说过于内存密集型时,才应当配置 JNI 阅读器线程。

根据可用系统资源量和工作负载需求的不同,应该为 ORB 分配的 JNI 阅读器线程数取决于许多因素,并且随环境的不同而有显著的变化。如果使用 JNI 线程,就会有下列潜在的益处:
  • 因为分配固定数目的线程,因此降低了内存使用量。在包含异常大量并且持久的客户机请求工作负载的环境中,降低内存使用量带来的益处十分显著。
  • 因为 ORB 初始化期间已创建和分配了固定数目的 JNI 线程,所以省去了动态地创建和消除 Java 线程所需的时间。
  • 每个 JNI 线程能够处理多达 1024 个套接字连接,并且直接与异步 I/O 本机操作系统机制进行交互(该机制提高了网络 I/O 处理性能)。

指示主题类型的图标 参考主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rorb_tims
文件名:rorb_tims.html