WebLogic ServerのExalogic最適化機能を調べてみる #JPOUG
この記事はJPOUG Advent Calendarの23日目です。
最近のOracle OpenWorldでは毎年アプライアンス製品*1が発表されている訳です。
その中でミドルウェアに特化した製品としては、Oracle Exalogic Elasitic Cloud(以降、基本的にExalogicと略)が数年前に発表されました。
この記事ではWebLogic Server(以降、基本的にWLSと略)のExalogic最適化機能について調べてみましょう。*2
当然ながら、通常のWLSでは利用できず、Exalogicのハードウェアおよびソフトウェアライセンスで利用できる機能ではあるのですが、WLSのチューニングの方向性について、何かしらヒントが得られるかもしれません。
マスタースイッチ
当然手元にExalogicがある訳はないので、擬似的に以下の環境で見てみたいと思います。
さて、WLSにはExalogic用のいわゆる“マスタースイッチ”と呼ばれる設定があります。
- {ドメイン}→構成→一般→Exalogic最適化の有効化
この設定をOnにして、再起動することで、WLSのExalogic最適化機能が有効化されるのですが、実際にはどのような機能があるのでしょう。
WLSの本番モードだと、管理コンソール左上のチェンジセンターから、[変更と再起動の表示]にて、変更される内容を事前に確認することができます。
MBeanレベルで様々な設定が有効になることが分かりますね。
余談も含みますが、運用時に[変更のアクティブ化]をする前には、必ず[変更と再起動の表示]にて、意図する設定のみ反映される(逆に言うと、意図しない設定が反映されない)ことを確認した方がよいです。
WLST(WebLogic Scripting Tool)であれば、編集中に showChanges() を実行することで同様の情報を確認できます。
wls:/wls1213-exalogic/edit !> showChanges() All changes that are made but not yet activated are: MBean Changed : com.bea:Name=wls1213-exalogic,Type=Domain Operation Invoked : modify Attribute Modified : ExalogicOptimizationsEnabled Attributes Old Value : false Attributes New Value : true Server Restart Required : true MBean Changed : com.bea:Name=Cluster-0,Type=Cluster Operation Invoked : modify Attribute Modified : SessionLazyDeserializationEnabled Attributes Old Value : false Attributes New Value : true Server Restart Required : true MBean Changed : com.bea:Name=AdminServer,Type=Server Operation Invoked : modify Attribute Modified : MuxerClass Attributes Old Value : weblogic.socket.NIOSocketMuxer Attributes New Value : weblogic.socket.NIOSharedWorkSocketMuxer Server Restart Required : true MBean Changed : com.bea:Name=AdminServer,Type=Server Operation Invoked : modify Attribute Modified : AddWorkManagerThreadsByCpuCount Attributes Old Value : false Attributes New Value : true Server Restart Required : true MBean Changed : com.bea:Name=AdminServer,Type=Server Operation Invoked : modify Attribute Modified : GatheredWritesEnabled Attributes Old Value : false Attributes New Value : true Server Restart Required : true MBean Changed : com.bea:Name=AdminServer,Type=Server Operation Invoked : modify Attribute Modified : ScatteredReadsEnabled Attributes Old Value : false Attributes New Value : true Server Restart Required : true MBean Changed : com.bea:Name=AdminServer,Type=Server Operation Invoked : modify Attribute Modified : UseConcurrentQueueForRequestManager Attributes Old Value : false Attributes New Value : true Server Restart Required : true MBean Changed : com.bea:Name=AdminServer,Type=TransactionLogJDBCStore,Server=AdminServer Operation Invoked : modify Attribute Modified : OraclePiggybackCommitEnabled Attributes Old Value : false Attributes New Value : true Server Restart Required : true (以降、管理対象サーバー分も同様なので省略)
ちょっとまとめてみましょう。以下のような設定があります。
Type | Attribute | Value |
---|---|---|
Domain | ExalogicOptimizationsEnabled | true |
Cluster | SessionLazyDeserializationEnabled | true |
Server | MuxerClass | weblogic.socket.NIOSharedWorkSocketMuxer |
Server | AddWorkManagerThreadsByCpuCount | true |
Server | GatheredWritesEnabled | true |
Server | ScatteredReadsEnabled | true |
Server | UseConcurrentQueueForRequestManager | true |
TransactionLogJDBCStore | OraclePiggybackCommitEnabled | true |
これらの設定の詳細はドキュメントで確認することができます。
- WebLogic Server Domain Optimizations for Exalogic Elastic Cloud Software
- The WebLogic Server MBean Reference
- Licensing Information - Oracle WebLogic Server Optimizations for Exalogic Elastic Cloud Software
なお、{WLSドメイン}/config/config.xmlを確認すると、“マスタースイッチ”であるExalogicOptimizationsEnabledについては反映されますが、他の項目については直接反映されていないことが分かります。
<exalogic-optimizations-enabled>true</exalogic-optimizations-enabled>
個別の設定に関しては、必要に応じてオーバーライドでき、その時点でconfig.xmlにも反映されます。
例えばSessionLazyDeserializationEnabledは、HTTPセッションの遅延デシリアライズを有効にすることで、レプリケーション時のメモリ利用を効率化できるようですが、おそらくパフォーマンスとしては無効化しておいた方がよいケースも考えられます。
動作の確認
少しだけ実際の動作がどうなっているか確認してみましょう。
前回の記事と同様にスレッドダンプから見ることにします。
"ExecuteThread: '3' for queue: 'weblogic.socket.Muxer'" #40 daemon prio=5 os_prio=31 tid=0x00007ff1cb684000 nid=0x7103 runnable [0x000000011eb26000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method) at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198) at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:103) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <0x00000007a1b0aed0> (a sun.nio.ch.Util$2) - locked <0x00000007a1b0aec0> (a java.util.Collections$UnmodifiableSet) - locked <0x00000007a1b0ad90> (a sun.nio.ch.KQueueSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at weblogic.socket.NIOSocketMuxer.selectFrom(NIOSocketMuxer.java:529) at weblogic.socket.NIOSharedWorkSocketMuxer.processSockets(NIOSharedWorkSocketMuxer.java:92) at weblogic.socket.SocketReaderRequest.run(SocketReaderRequest.java:30) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:43) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:147) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:119)
NIOSharedWorkSocketMuxer が使われていることが分かりますね。
また、以下のようなスレッドも確認できます。
"RequestManagerPoller" #20 daemon prio=10 os_prio=31 tid=0x00007ff1c8cd2000 nid=0x3507 waiting on condition [0x000000011cc38000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) at weblogic.utils.collections.Turnstile.awaitOn(Turnstile.java:79) at weblogic.utils.collections.Turnstile.await(Turnstile.java:100) at weblogic.utils.collections.Turnstile.spinAwait(Turnstile.java:93) at weblogic.utils.collections.PartialOrderSet$WindowedArrayQ.dequeue(PartialOrderSet.java:757) at weblogic.utils.collections.PartialOrderSet.take(PartialOrderSet.java:671) at weblogic.work.RequestManager$BufferQueueDrainer.run(RequestManager.java:1336) at java.lang.Thread.run(Thread.java:745)
これはUseConcurrentQueueForRequestManagerの設定によって反映されるようです。
他にも見て行きたいところですが、実機でパフォーマンス含め確認しないと意味ないものもありますし、長くなりすぎるのでこの辺りにしておきましょう。*4
他のExalogic最適化機能
先日、12/18にWebLogic Server勉強会で発表した資料で少しだけ触れているのですが、WLS 12.1.3では以下の機能がExalogic用に追加されていて、起動・停止スクリプトからその一端を垣間見ることができます。
まとめ
- WLSのExalogic最適化機能は、必ずしもExalogic環境でなくても擬似的に確認できるものもあります。*5
- 一足早いですが、メリークリスマス!とは言え、サンタさん、自宅にExalogicは要りません。電源が吹っ飛びます。というか床が抜けます。
*1:正確にはOracle Engineered Systemsと呼ぶ。
*2:細かいですが間違いやすいこととして、Web"L"ogicとExa"l"ogicで、大文字小文字が異なります!
*3:WLS 12.1.3はOracle JDK 8u20以降で動作保証していますが、Fork/Join Frameworkやパラレルストリームはサポートしていません。また、Mac OS X 10.10は記事執筆時点では正式動作保証はされていません。
*4:単に疲れただけとも言う…
*5:もちろんSDP(Socket Direct Protocol)のようにハードウェア依存(InfiniBand)のところは、実機でないと厳しいです。