为了完全理解WebLogic服务器如何工作,并让它表现出最佳性能,我们很有必要理解几个概念。最重要的概念都在下面的内容中谈到了。本文为第一部分。
执行线程和队列
本部分内容简单描述了Oracle WebLogic服务器的内部架构,大家可以了解到该服务器如何执行工作来满足用户请求的。当客户端向WebLogic发起请求时,响应该请求的实际工作是由叫做执行线程的Java线程执行的。用户可以使用指向Servlet引擎的基于HTTP的请求,或者访问诸如企业级JavaBean(EJB)这类对象的远程方法调用(RMI)来提交工作。当服务器进程启动时,它会把自己绑定到一个端口,并给该端口分配一个针对传入请求的监听线程。一旦该请求建立了连接,服务器就把该连接的控制传递给socket muxer。Socket muxer从socket读取请求,并在请求到达时把工作请求放到自调整的执行队列中。一个空闲的执行线程将从执行队列取出请求,再把这些请求的响应工作转发给专门的处理线程。执行线程执行请求并返回响应。
Oracle WebLogic服务器使用socket muxer(软件模块)读取服务器上的传入请求。Muxer从网络上读取消息,并把它们打成工作包,然后放入工作管理器队列,通过某个线程执行工作并确保响应回到请求来源的同一个socket去。有两种类型的muxer,一种是Java Muxer,另一种是本地muxer。Java muxer使用专门平台的本地二进制包。默认情况下,Oracle WebLogic使用本地muxer——也就是说,该服务器的“启用本地IOP”参数是选中状态。要注意的是,若使用本地muxer,该服务器会创建固定数量的线程来读取传入请求;而使用Java muxer,你可以在管理控制台中修改“Socket读取器百分比”参数来配置线程数量。本地muxer分配特定比例的服务器线程来用作socket读取器线程,形成线程池功能,同时剩下的服务器线程忙着处理客户端请求。一般情况下,你需要小心修改socket读取器线程的数量。在许多情况下,最优化的配置是设置为“1”。
如果你想知道使用的是本地muxer还是Java muxer,看看消息涉及的执行线程就知道了。如果你用的是本地muxer,服务器错误信息会提示“weblogic.socket.EPollSocketMuxer”;而如果你使用的是Java muxer,你看到的就会是“weblogic.socket.SocketMuxer”。要注意的是,“EPollSockerMuxer”只与运行于Linux服务器上的JRockit JVM有关。如果配置为本地muxer,你还可以看到“poll”字样,因为它使用了轮询机制来查询socket数据。本地muxer被认为能提供更优越的性能,尤其是在扩展为大用户群的情况下,因为它们使用了无阻塞线程模型。在管理WebLogic服务器实例时,你会经常遇到“阻塞线程”的情况,这种情况一般发生在某个线程不能在设定时间内(默认是十分钟)返回线程池的时候发生。
执行JMX API和MBeans
WebLogic服务器是用Sum的Java管理扩展实现的部署系统管理基础架构。执行JMX API涉及到使用Java MBeans(受管bean)给系统管理任务建模。如果你理解MBean和JMX API,你可以使用它们创建你自己定制的管理工具。然而,所有的管理工具(比如,管理控制台)都使用相同的MBean和JMX API,所以你不必重新发明轮子来创建定制管理工具。虽然WebLogic服务器管理员不需要知道如何用JMX API编程,但是如果对其编程有所了解的话,有助于理解不同类型的MBean以及理解JMX API如何与它们交互。
WebLogic服务器使用两种基本类型的MBean——配置MBean和运行时MBean——来配置、监视和管理服务器以及其资源。
配置MBean包含服务器和资源的配置信息,存储在域配置文件中,比如“config.xml”文件或者其它XML文件。这些都是持久的MBean,而域配置文件(config.xml)为这些MBean存储属性值。不管什么时候你用管理工具(比如管理服务器)修改了配置属性,这些变更都会持久化到“config.xml”文件中。通过修改启动脚本,在Java启动命令中添加额外参数“-D”选项,也可以修改配置值。如果你修改了任何配置设置,“config.xml”文件都会自动更新。当受管服务器启动时,它会联系管理服务器,获得配置信息副本,在内存中存储为配置MBean。因此,域中的所有服务器在内存中都有相同的配置副本。要注意,在启动受管服务器时,你修改的任何属性都不会影响“config.xml”文件;只有在管理服务器上修改的属性值,才会保存到“config.xml”文件中。当你关闭服务器实例时,该服务器托管的所有配置MBean都会被销毁。
运行时MBean帮助监视运行服务器实例,它包含保持服务器实例和应用程序运行时信息的属性。每个服务器的资源都会更新相关运行时MBean,包括其状态变化。例如,“ServerRuntimeMBean ”在服务器启动时会初始化,其中包括了该服务器的运行时数据。运行时MBean只由运行时数据构成,没有其它内容。当你关闭服务器时,“ServerRuntimeMBean ”中的运行时统计都被销毁了,其它所有运行时MBean的情况也类似。
MBean服务器充当着各种MBean容器的角色,该服务器创建并提供对MBean的访问。Oracle提供三种类型的MBean服务器。管理服务器托管域运行时MBean服务器实例,它为域范围内的服务管理MBean。受管服务器和管理服务器都托管运行时MBean服务器,它支持你配置服务器实例。管理服务器还托管编辑MBean服务器,它管理挂起的配置变更。管理服务器和受管服务器还可以选择性地托管JVM的平台MBean服务器,它控制包含JDK监视信息的MBean。
你可以在服务器实例运行时动态修改大部分域配置属性。对于不支持动态配置的属性,你就必须重启服务器实例了。你配置的运行时属性值将立即反映出你所作的变更,这些值会持久地保存在“config.xml”文件中。