如何启用 WebLogic 8.1 线程缓冲池模型
BEA 提供了一种标志,可用于禁用自调整性执行缓冲池,它还为升级应用程序提供了向后兼容性以继续使用用户定义的执行队列。
要在 WebLogic Server 9.x 域中使用用户定义的执行队列,需要在 config.xml 文件中添加 server 元素的 use81-style-execute-queues 子元素,然后重新启动服务器。
注意: 要以 81-style-execute-queues 模式运行 WebLogic Server,而且要能够调整线程数,则需要其他的步骤。首先,在配置文件中将 use81-style-execute-queues 元素设置为 true。然后,从管理控制台显式创建 weblogic.kernel.Default 执行队列,并重新引导服务器。
通过使用下列示例代码,myserver 的实例可以使用执行队列。
清单 B-1 使用 use81-style-execute-queues 元素
..<server> <name>myserver</name> <ssl> <name>myserver</name> <enabled>true</enabled> <listen-port>7002</listen-port> </ssl> <use81-style-execute-queues>true</use81-style-execute-queues> <listen-address/></server>...已配置的工作管理器在运行时会被服务器实例转换到执行队列。
--------------------------------------------------------------------------------
调整默认执行队列
config.xml 文件中 ExecuteQueue 元素的 ThreadCount 特性的值等于使用执行队列的应用程序同时执行的操作数。随着工作进入 WebLogic Server 实例,会将此工作放置在执行队列中。然后将此工作分配到执行它的线程上。线程会使用资源,因此根据此特性处理时需小心 - 增加不必要的值会降低性能。由于服务器实例的启动模式不同,WebLogic Server 所使用的默认执行队列的线程计数的默认值也会不同。请参阅“管理控制台联机帮助”中的指定启动模式。
表 B-1 启动模式的默认线程计数 服务器模式 . 默认线程计数 .
开发模式 15 个线程
生产模式 25 个线程
除非配置其他执行队列并将应用程序分配到这些队列,否则服务器实例会将请求分配到默认的执行队列。
注意: 如果您的平台没有使用本地性能包,则可能需要调整执行队列线程的默认数值和作为套接口读取器的线程的百分比,以获得最佳性能。有关详细信息,请参阅分配执行线程以充当套接口读取器。
是否要修改默认线程计数?
将更多的线程添加到默认执行队列不表示必然能够处理更多的工作。即使添加了更多的线程,仍然要受到处理器能力的限制。不必要地增加 ThreadCount 的值会降低性能。较大的执行线程计数会导致占用更多的内存,并且增加上下文的切换,因此会降低性能。
ThreadCount 特性的值主要取决于应用程序的工作类型。例如,如果客户端应用程序较小并且大部分工作通过远程调用完成,那么,与主要进行客户端处理的客户端应用程序相比,前者将花费更多的时间进行连接,因此需要更大的线程计数。
如果您的工作所需要的线程数不超过 15 个(开发模式默认值)或 25 个(生产模式默认值),则不要更改该特性的值。作为一般规则,如果应用程序执行返回时间较长的数据库调用,则相对于另一个执行短小且可快速返回的调用的应 用程序来说,需要更多的执行线程。对于后一种情况,使用较少的执行线程可提高性能。
要为执行队列确定理想的线程计数,可在队列中的所有应用程序运行负载最大的情况下监视队列的吞吐量。增加队列中的线程数并重复负载试验,直至队列的吞吐量达到最优值。(线程数增加到某个点时,将导致上下文切换过多而使队列的吞吐量开始下降。)
注意: WebLogic Server 管理控制台可显示服务器上所有执行队列的累计吞吐量。要访问该吞吐量值,请按照使用执行队列控制线程使用中的步骤 1-6 执行。
表 B-2 显示了用于调整可用线程数的默认方案,该线程数与 WebLogic Server 域中的可用 CPU 数有关。这些方案也假定 WebLogic Server 在最大负载下运行,而且通过使用默认执行队列可满足所有线程的请求。如果配置其他执行队列并将应用程序分配到特定队列,则可在缓冲池相连的基础上监视结 果。
表 B-2 修改默认线程计数的方案 条件... 结果... 操作:
线程计数 < CPU 数 正在使用 CPU,但仍可以做其他工作。 增加线程计数。
线程计数 = CPU 数 正在使用 CPU,但仍可以做其他工作。 增加线程计数。
线程计数 > CPU 数(线程数适中) CPU 使用率较高,上下文切换数量适中。 适当调整线程数,然后比较性能结果。
线程计数 > CPU 数(线程数很大) 上下文切换过多。 减少线程数。
使用执行队列控制线程使用
通过使用 WebLogic Server 中用户定义的执行队列,可以微调应用程序对执行线程的访问(从而优化或降低其性能)。但是,请记住,未使用的线程表示在 WebLogic Server 系统中有重大的资源浪费。您会发现已配置执行队列中的可用线程未得到使用,而同时其他队列中的任务却处于空闲中等待可用的线程。在这种情况下,与使用默认 的单个执行队列相比,将线程分配到多个队列会使整体性能变得更差。
在 WebLogic Server 的默认安装上配置有默认执行队列,供在该服务器实例上运行的所有应用程序使用。您可能希望配置其他队列以执行下列操作:
优化重要应用程序的性能。例如,可以将一个具有重要任务的应用程序分配到特定的执行队列中,这样可以保证执行线程数的固定。在服务器峰值负载期间,不重要的应用程序可能会争用默认执行队列中的线程,但是具有重要任务的应用程序在任何时候都有权访问同样数目的线程。
限制不必要的应用程序的性能。对于一个可能使用大量内存的应用程序来说,将它分配到专门的执行队列会有效地限制其可以使用的内存量。虽然该应用程序可能使用它所在执行队列中的所有可用线程,但却不会影响任何其他队列中的线程使用。
补救死锁的线程使用。对 于某些应用程序设计,如果当前正在使用所有的执行线程,则可能发生死锁。例如,以从指定 JMS 队列中读取消息的 Servlet 为例。如果服务器中的所有执行线程都用于处理 Servlet 请求,则从 JMS 队列中发送消息时就没有可用的线程。只要造成死锁的条件存在,所有工作就不会有进展。将 Servlet 分配到单独的执行队列中可阻止潜在的死锁,因为 Servlet 和 JMS 队列不会争用线程资源。
请务必监视每个执行队列,确保在整个系统中正确地使用线程。有关优化线程数的一般信息,请参阅是否要修改默认线程计数?。