WAS/WebLogic

[개요] 웹로직 Socket Muxer

투칼론 2016. 4. 1. 06:01
반응형

1. 개요


WebLogic 서버는 서버로 들어오는 요청과 클라이언트에 응답을 처리하기 위해 Socket Muxer라는 모듈을 사용한다. Socket Muxer는 수힌한 요청을 읽어, Execute Thread Queue에 넣는 역할을 한다.

WebLogic 8.1에서는 기본적으로 3개의 Muxer 스레드가 생성되고, WebLogic 9.x 이상부터는 기본적으로 서버 스레드의 33%가 Muxer 스레드로 할당된다.


WebLogic Server는 다음과 같은 세가지 유형의 Muxer를 지원한다:


  • 자바 Muxer
  • 네이티브 Muxer
  • 논블록킹 IO Muxer

[참고] 논블로킹 IO Muxer는 12c에서 추가됨.



2. Muxer 설정


WebLogic Server는 Muxer를 다음과 같은 기준을 사용하여 선택합니다.


  • 관리 콘솔에 "Enable Native IO"가 check되어 있지 않고, MuxerClass가 null의 경우, 자바 Muxer가 사용된다.
  • 관리 콘솔에 "Enable Native IO"가 check되고, MuxerClass가 null의 경우, Native Muxer가 플랫폼에 사용 가능한 경우 사용된다.
  • 관리 콘솔에 "Enable Native IO"가 check되고Muxer 클래스 속성 weblogic.socket.NIOSocketMuxer 또는 -Dweblogic.MuxerClass=weblogic.socket.NIOSocketMuxer 플래그가 설정되어 있으면, NIOSocketMuxer(논블록킹 IO Muxer)가 사용된다.



3. Muxer 종류


자바 Muxer


소켓에서 데이터를 읽을때 순수 자바를 사용합니다. 

또한 RMI 클라이언트에 대해 사용할 수있는 유일한 먹서입니다.

소켓에 읽을 데이터가 남아 있을때까지 블록됩니다. 많은 수의 소켓이 존재하는 경우와 소켓에 가끔 데이터가 도착할 때, Scale하지 않습니다. 다수의 클라이언트를 처리를 위해서 서버에서 병목이 생길 수 있습니다..


Enable Native I/O가 체크되어 있지 않으면, 자바 Muxer를 사용합니다. 요청을 처리하는 스레드 수는 정해져있지 않고, “Percent Socket Readers” 파라미터로 조정됩니다.


[Stack Trace from Thread dump]



"[ACTIVE] ExecuteThread: '16' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x00000001035fb800 nid=0x2c runnable [0xffffffff6a5fe000]
   java.lang.Thread.State: RUNNABLE
 at java.net.SocketInputStream.socketRead0(Native Method)
 at java.net.SocketInputStream.read(SocketInputStream.java:129)
 at weblogic.socket.SocketMuxer.readFromSocket(SocketMuxer.java:988)
 at weblogic.socket.SocketMuxer.readReadySocketOnce(SocketMuxer.java:922)
 at weblogic.socket.SocketMuxer.readReadySocket(SocketMuxer.java:889)
 at weblogic.socket.JavaSocketMuxer.processSockets(JavaSocketMuxer.java:339)
 at weblogic.socket.SocketReaderRequest.run(SocketReaderRequest.java:29)
 at weblogic.work.ExecuteThread.execute(ExecuteThread.java:252)

 at weblogic.work.ExecuteThread.run(ExecuteThread.java:221) 



네이티브 Muxer


Native Muxer는 OS에 종속적인 native 라이브러리를 사용하므로, 플랫폼 별 네이티브 바이너리를 사용합니다. UNIX/Linux 계열은 poll 시스템 콜을 사용하고, 윈도우에서는 completion ports를 사용합니다. 네이티브 Muxer는 대용량 클라이언트 처리를 위해 논 블록킹 스레드 모델을 통해 확장성있는 모델을 제공합니다.

들어온 요청에 따라 정해진 스레드 수(기본 4개)를 제공합니다.


CPU 집중된 애플리케이션(예, SpecJAppServer)의 처리량(throughput)을 증가시키기 위해 다음과 같은 설정을 제공합니다.

-Dweblogic.socket.SocketMuxer.DELAY_POLL_WAKEUP=xx

 

위에서 xx는 데이터가 있는지 체크 전에 delay할 microsecond입니다. 디폴트 값은 0입니다(no delay 의미임)


[Stack Trace from Thread dump]


  "ExecuteThread: '2' for queue: 'weblogic.socket.Muxer'" daemon prio=3 tid=0x00000001042f4800 nid=0x1e waiting for monitor entry [0xffffffff5e6ff000]
 java.lang.Thread.State: BLOCKED (on object monitor)
                at weblogic.socket.DevPollSocketMuxer.processSockets(DevPollSocketMuxer.java:92)
                - waiting to lock <0xfffffffe20485978> (a java.lang.String)
                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) 



논블록킹 IO Muxer


일부 응용 프로그램을위한 향상된 성능을 제공하는 논블록킹 IO Muxer를 제공합니다. 사용하기 위해서는 "Enable Native I/O"를 체크해야하고, Muxer Class 필드에 weblogic.socket.NIOSocketMuxer 를 등록하면 됩니다.


[Stack Trace from Thread dump]


  "ExecuteThread: '3' for queue: 'weblogic.socket.Muxer'" daemon prio=3 tid=0x000000010360f800 nid=0x31 runnable [0xffffffff5c2ff000]
 java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.DevPollArrayWrapper.poll0(Native Method)
        at sun.nio.ch.DevPollArrayWrapper.poll(DevPollArrayWrapper.java:171)
        at sun.nio.ch.DevPollSelectorImpl.doSelect(DevPollSelectorImpl.java:84)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
        - locked <0xfffffffe23f121d8> (a sun.nio.ch.Util$2)
        - locked <0xfffffffe23f121c8> (a java.util.Collections$UnmodifiableSet)
        - locked <0xfffffffe23ebc5b8> (a sun.nio.ch.DevPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
        at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:102)
        at weblogic.socket.NIOSocketMuxer.processSockets(NIOSocketMuxer.java:320)

        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) 




4. 기타 


Enable Native I/O를 설정해놓고, 해당 Native 라이브러리를 로딩하지 못할때, 아래와 같은 로그가 출력됩니다. 즉, 아래와 같은 로그가 출력되면 "자바 Muxer"를 사용하게 됩니다.


<BEA-000438> <Unable to load performance pack. Using Java I/O instead.


[자료참조] http://kumarsoablog.blogspot.kr/2013/01/weblogic-muxer-thread.html


- End -