什么是weblogic.socket.Muxer?

您是否了解WebLogic 8.1中使用的weblogic.socket.Muxer是什么?

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

"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)它会影响任何表现吗?

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

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

Java muxer具有以下特征:

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

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

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

然后,由于这些原因,使用本机复用器显然更好。

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

我发现这个链接几乎解释了这种情况:

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

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

“复用器”是多路复用器,它是将若干数据流组合到单个信道上的机制。 Weblogic将使用它们与自身或群集中的其他节点交换数据。 在任何时候,其中一些将被“阻止”,因为它们无关。

这几乎肯定不值得关注。 如果你在岩石下面看,你必定会在阳光下向你眨眼看到一些丑陋的东西。