你们中有人了解 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 Muxers Percent Socket Readers管理控制台中的参数设置。看 更改可用的插座读取器的数量. 。理想情况下,您应该配置此参数,因此线程数大约等于同时连接客户端的遥控器数量,最高为总线程池大小的50%。每个线程等待固定的时间才能在插座上可用。如果没有数据到达,则线程将移至下一个插座。

那么,出于这些原因,使用本机复用器显然更好。

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

其他提示

我找到了此链接几乎解释了这种情况:

  

套接字Muxer管理服务器’ s   现有套接字连接。它首先   确定哪些套接字有来电   请求等待处理。它   然后读取足够的数据来确定   协议并调度套接字   到适当的运行时层   在协议上。在运行时层中,   套接字muxer线程确定   执行要使用的线程队列   并相应地委托请求。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top