什么是 weblogic.socket.Muxer?
-
06-07-2019 - |
题
你们中有人了解 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)它会影响任何性能吗?
解决方案
从文档(http://download.oracle.com/docs/cd/E13222_01/wls/docs100/perform/WLSTuning.html#wp1152246):
WebLogic Server使用称为Muxers的软件模块来读取服务器上的传入请求,并在客户端上发出响应。这些Muxers有两种主要类型:Java Muxer或本地Muxer。
Java Muxer具有以下特征:
- 使用纯Java从套接字读取数据。
- 它也是唯一可用于 RMI 客户端的复用器。
- 阻塞读取,直到有数据要从套接字读取。当有大量插座和/或数据到达插座上时,这种行为并不能很好地扩展。对于客户端来说,这通常不是问题,但它可能会给服务器造成巨大的瓶颈。
本机修器使用特定于平台的本机二进制文件来读取插座的数据。所有平台中的大多数都提供了一些机制来调查数据的插座。例如,UNIX系统使用轮询系统,Windows体系结构使用完成端口。本机提供了出色的可扩展性,因为它们实现了非阻滞线程模型。使用本机Muxer时,服务器会创建固定数量的线程,用于读取传入请求。BEA建议使用选择的默认设置
Enable Native IO
允许服务器自动选择服务器使用的合适Muxer的参数。如果
Enable Native IO
未选择参数,服务器实例专门使用Java Muxer。如果有少数客户端,并且到达服务器的请求速率相当高,则可以接受。在这些条件下,Java Muxer以及本机Muxer的性能以及消除Java天然界面(JNI)的开销。与本机示威者不同,用于读取请求的线程的数量不是固定的,并且可以通过配置来调整Java MuxersPercent Socket Readers
管理控制台中的参数设置。看 更改可用的插座读取器的数量. 。理想情况下,您应该配置此参数,因此线程数大约等于同时连接客户端的遥控器数量,最高为总线程池大小的50%。每个线程等待固定的时间才能在插座上可用。如果没有数据到达,则线程将移至下一个插座。
那么,出于这些原因,使用本机复用器显然更好。
在这里,看起来您正在使用默认的本机复用器(weblogic.socket.EPollSocketMuxer
),而不是 Java 复用器(weblogic.socket.SocketMuxer)
.
其他提示
我找到了此链接几乎解释了这种情况:
套接字Muxer管理服务器’ s 现有套接字连接。它首先 确定哪些套接字有来电 请求等待处理。它 然后读取足够的数据来确定 协议并调度套接字 到适当的运行时层 在协议上。在运行时层中, 套接字muxer线程确定 执行要使用的线程队列 并相应地委托请求。
对于任何给定的应用程序服务器,线程转储将向您显示数百个(如果不是数千个)后台线程。这些服务器是复杂的野兽,这些线程只是后台管道工作。
“muxer”是一种多路复用器,它是一种将多个数据流组合到一个通道上的机制。 Weblogic将使用它们与自身或群集中的其他节点交换数据。在任何特定时间,其中一些将被“阻止”,因为它们无关。
这几乎肯定不值得关注。如果你在岩石下面看,你必定会在阳光下眨眼看到一些丑陋的东西。