yamadamn’s blog

IT関連技術で経験したこと・気になったことをたまに書きます

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

これらの設定の詳細はドキュメントで確認することができます。

なお、{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)のところは、実機でないと厳しいです。