12

你们中有人了解 weblogic.socket.Muxer 在 WebLogic 8.1 中的用途吗?

通常在线程转储中,我会看到类似于以下的堆栈跟踪:

"ExecuteThread: '0' for queue: 'weblogic.socket.Muxer'" id=20 idx=0x68 tid=26709 prio=5 alive, in native, blocked, daemon
    -- Blocked trying to get lock: java/lang/String@0x2b673d373c50[fat lock]
    at jrockit/vm/Threads.waitForUnblockSignal()V(Native Method)
    at jrockit/vm/Locks.fatLockBlockOrSpin(Locks.java:1675)[optimized]
    at jrockit/vm/Locks.lockFat(Locks.java:1776)[optimized]
    at jrockit/vm/Locks.monitorEnterSecondStageHard(Locks.java:1312)[optimized]
    at jrockit/vm/Locks.monitorEnterSecondStage(Locks.java:1259)[optimized]
    at jrockit/vm/Locks.monitorEnter(Locks.java:2439)[optimized]
    at weblogic/socket/EPollSocketMuxer.processSockets(EPollSocketMuxer.java:153)
    at weblogic/socket/SocketReaderRequest.run(SocketReaderRequest.java:29)
    at weblogic/socket/SocketReaderRequest.execute(SocketReaderRequest.java:42)
    at weblogic/kernel/ExecuteThread.execute(ExecuteThread.java:145)
    at weblogic/kernel/ExecuteThread.run(ExecuteThread.java:117)
    at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)
    -- end of trace

并不是说我对此有任何问题,只是很有趣地理解:

1)它在做什么?
2)它会影响任何性能吗?

4

3 回答 3

9

从文档(http://download.oracle.com/docs/cd/E13222_01/wls/docs100/perform/WLSTuning.html#wp1152246):

WebLogic Server 使用称为复用器的软件模块来读取服务器上的传入请求和客户端上的传入响应。这些多路复用器有两种主要类型:Java 多路复用器或本机多路复用器。

Java 多路复用器具有以下特点:

  • 使用纯 Java 从套接字读取数据。
  • 它也是唯一可用于 RMI 客户端的复用器。
  • 阻塞读取,直到有数据要从套接字读取。当有大量套接字和/或数据很少到达套接字时,这种行为不能很好地扩展。这对于客户端来说通常不是问题,但它会给服务器造成巨大的瓶颈。

本机多路复用器使用特定于平台的本机二进制文件从套接字读取数据。大多数平台都提供了一些机制来轮询套接字以获取数据。例如,Unix 系统使用 poll 系统,Windows 体系结构使用完成端口。Native 提供了卓越的可扩展性,因为它们实现了非阻塞线程模型。当使用本机复用器时,服务器会创建固定数量的线程,专用于读取传入请求。BEA 建议对 Enable Native IO参数使用默认设置 selected,它允许服务器自动选择适当的 muxer 供服务器使用。

如果Enable Native IO未选择该参数,则服务器实例将独占使用 Java 多路复用器。如果有少量客户端并且请求到达服务器的速率相当高,这可能是可以接受的。在这些条件下,Java 多路复用器的性能与本机多路复用器一样好,并消除了 Java 本地接口 (JNI) 开销。与本机多路复用器不同,用于读取请求的线程数不是固定的,可以通过Percent Socket Readers 在管理控制台中配置参数设置来针对 Java 多路复用器进行调整。请参阅更改可用套接字读取器的数量. 理想情况下,您应该配置此参数,使线程数大致等于远程并发连接的客户端数,最多为总线程池大小的 50%。每个线程等待一段固定的时间,以便数据在套接字上可用。如果没有数据到达,线程移动到下一个套接字。

那么,由于这些原因,使用原生多路复用器显然更好。

在这里,看起来您使用的是默认的本机多路复用器 ( weblogic.socket.EPollSocketMuxer),而不是 Java 多路复用器 ( weblogic.socket.SocketMuxer).

于 2009-10-26T11:00:19.867 回答
7

我发现这个链接可以很好地解释这种情况:

套接字 Muxer 管理服务器现有的套接字连接。它首先确定哪些套接字有等待处理的传入请求。然后它读取足够的数据来确定协议并根据协议将套接字分派到适当的运行时层。在运行时层,套接字复用器线程确定要使用哪个执行线程队列并相应地委托请求。

于 2009-10-26T09:30:04.393 回答
5

对于任何给定的应用程序服务器,线程转储将向您显示数百个(如果不是数千个)后台线程。这些服务器是复杂的野兽,这些线程只是后台管道的工作。

“复用器”是一种多路复用器,它是一种将多个数据流组合到单个通道上的机制。Weblogic 将使用这些与自身或集群中的其他节点交换数据。在任何给定时间,其中一些将被“阻止”,因为它们无事可做。

这几乎可以肯定没有理由担心。如果你在岩石下面看,你一定会发现下面有一些丑陋的东西在阳光下向你眨眼。

于 2009-10-26T09:29:47.727 回答