你们中有谁知道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)它会影响性能吗?
发布于 2009-10-26 19:00:20
从文档(http://download.oracle.com/docs/cd/E13222_01/wls/docs100/perform/WLSTuning.html#wp1152246):
WebLogic服务器使用称为多路复用器的软件模块来读取服务器上的传入请求和客户端上的传入响应。这些多路复用器主要有两种类型: Java多路复用器或本地多路复用器。
Java多路复用器具有以下特征:
本机多路复用器使用特定于平台的本机二进制文件从套接字读取数据。大多数平台都提供了某种机制来轮询套接字以获取数据。例如,Unix系统使用轮询系统,Windows体系结构使用完成端口。Native提供了卓越的可伸缩性,因为它们实现了非阻塞线程模型。使用本机多路复用器时,服务器会创建固定数量的线程,专门用于读取传入的请求。BEA建议对Enable Native IO参数使用缺省设置selected,这允许服务器自动为服务器选择要使用的适当多路复用器。
如果未选择Enable Native IO参数,则服务器实例将独占使用Java muxer。如果客户端数量很少,并且请求到达服务器的速率相当高,则这可能是可以接受的。在这些条件下,Java多路复用器的性能与本机多路复用器一样好,并消除了Java native Interface (JNI)开销。与本机多路复用器不同,用于读取请求的线程数不是固定的,可以通过在Administration Console中配置Percent Socket Readers参数设置来对其进行调整。参见Changing the Number of Available Socket Readers。理想情况下,您应该配置此参数,使线程数量大致等于远程并发连接客户端的数量,最高可达总线程池大小的50%。每个线程等待一段固定的时间,等待数据在套接字变得可用。如果没有数据到达,线程将移动到下一个套接字。
然后,由于这些原因,使用本地多路复用器显然更好。
在这里,看起来您使用的是缺省的本地多路复用器(weblogic.socket.EPollSocketMuxer),而不是Java多路复用器(weblogic.socket.SocketMuxer)。
发布于 2009-10-26 17:30:04
我已经找到了可以很好地解释这种情况的this link:
套接字多路复用器管理服务器的现有套接字连接。它首先确定哪些套接字有等待处理的传入请求。然后,它读取足够的数据来确定协议,并根据协议将套接字分派到适当的运行时层。在运行时层中,套接字多路复用器线程确定要使用的执行线程队列,并相应地委托请求。
发布于 2009-10-26 17:29:48
对于任何给定的应用服务器,线程转储将显示数百(如果不是数千)个后台线程。这些服务器是复杂的野兽,而这些线程只是完成其工作的后台管道。
“复用器”是一种多路复用器,它是一种将多个数据流组合到单个通道上的机制。Weblogic将使用这些来与自己或与集群中的其他节点交换数据。在任何给定的时间,其中的一些将被“阻止”,因为它们没有任何事情可做。
几乎可以肯定的是,这并不值得担心。如果你往石头下面看,你一定会发现一些丑陋的东西在阳光下闪闪发光。
https://stackoverflow.com/questions/1623692
复制相似问题