ページの先頭です。
ここから本文です。

お知らせ

[WebOTX] WebOTXがストールする問題と対策について

概要

ドメインの起動/停止時または配備解除時にWebアプリケーションクラスローダが行うリークチェック処理が原因でWebOTXがストールする場合があります。


影響のある製品

  • WebOTX Application Server Express V9.1~V9.4(※)
  • WebOTX Application Server Standard V9.2~V9.4
  • WebOTX Application Server Enterprise V9.2~V9.5
  • WebOTX Developer V9.1~V9.5

  • WebOTX Application Server Express V10.1(※)
  • WebOTX Application Server Standard V10.1
  • WebOTX Developer V10.1

(※)WebOTX Enterprise Service Bus V9.2、V9.3、V10.1、および、
     WebOTX Portal V9.3、V10.1にバンドルされている
     WebOTX Application Server Expressを使用している場合にも
     該当します。


詳細

[発生事象]
ドメインの起動時、停止時、Webアプリケーションの配備時、配備解除時、 プロセスグループの起動時、停止時に Java SEのロック用クラスの処理とWeb アプリケーション用のクラスローダの停止処理が競合してJava SEのロック用 クラスの処理で NullPointerExceptionが発生することがあります。

この場合、ロック用クラスの状態がロック中のままとなります。したがって、 次にロックを行う場合、ロックが解除されることが無いためそのスレッドがデ ッドロックします。

デッドロックするスレッドによって以下の様な事象が発生します。

  • ドメイン起動/停止処理スレッドがデッドロックした場合
    ドメインがストール

  • プロセスグループ起動/停止処理スレッドがデッドロックした場合
    プロセスグループがストール

  • アプリケーション処理スレッドがデッドロックした場合
    アプリケーションがストール

  • 運用管理コマンド処理スレッドがデッドロックした場合
    運用管理操作が受け付けられない
[確認方法]
Java SEのロック用クラスの処理の延長でのNullPointerExceptionの記録が WebOTXのログ に記録されていれば本件に合致します。

具体的な記録の例として以下があります。
---------------------------------------------------------------
Caused by: java.lang.NullPointerException
    at java.lang.ThreadLocal$ThreadLocalMap.expungeStaleEntry(ThreadLocal.java:XXX)
    at java.lang.ThreadLocal$ThreadLocalMap.remove(ThreadLocal.java:XXX)
    at java.lang.ThreadLocal$ThreadLocalMap.access$200(ThreadLocal.java:XXX)
    at java.lang.ThreadLocal.remove(ThreadLocal.java:XXX)
    at java.util.concurrent.locks.ReentrantReadWriteLock$Sync.tryReleaseShared(ReentrantReadWriteLock.java:XXX)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared(AbstractQueuedSynchronizer.java:XXX)
    at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.unlock(ReentrantReadWriteLock.java:XXX)
    ・・・
---------------------------------------------------------------

※WebOTXのログ
  • Webアプリケーションがエージェントプロセスに配備されている場合(スタンダードモード)の場合
    <ドメインdir>/logs/webotx_agent.log

  • Webアプリケーションがプロセスグループに配備されている場合(アドバンスドモード)の場合
    <ドメインdir>/logs/tpsystem/<アプリケーショングループ名>/<プロセスグループ名> 配下のプロセスグループのログ

ただし、ログに出ない場合もあるため、事象発生時にスレッドダンプを採取して確認し、 Java SEのロック用クラスがロックをしようとして進まない状態で あれば本件に合致します。
※この時WebOTXのコマンドでのスレッドダンプ採取は出来ない場合 があるためJavaが提供するスレッドダンプ採取機能で採取する 必要があります。

事象発生時のスレッドダンプの例は以下のとおりです。
java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for <0x00000000xxxxxxxx> (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:XXX)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:XXX)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:XXX)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:XXX)
    at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:XXX)

スレッドダンプを何回か採取して、このスレッドに動きが無ければ本件に合致します。

[復旧方法]
事象発生時にはWebOTXがストールしますので、ドメインの再起動(強制停止→起動)を して頂くようお願いいたします。

強制停止は、下記のように指定することで、当該ドメインの全プロセスが停止します。

otxadmin> stop-domain --force=true --wait_timeout=0 <ドメイン名>


対処方法

製品に対するパッチの公開時期は現在検討中です。
急ぎでパッチが必要な場合はご連絡ください。

(注意) パッチモジュールは製品保守契約を結んでいただいたお客様に限定して提供させていただいています。
まだ契約がお済みでないお客様は、保守契約締結の後、ダウンロードをお願いいたします。


回避方法

JavaVMオプションに、ThreadLocalのメモリリークチェックを行わない設定を行います。

  • 運用管理コマンドご利用の場合
    otxadmin> create-jvm-options -Dcom.nec.webotx.webcontainer.EnableCheckThreadLocalsForLeaks=false

  • 運用管理コンソールご利用の場合
    ドメイン > アプリケーションサーバ > JVM構成 > [JVMオプション]タブ > JVM オプション
    以下の値を追加します。
    -Dcom.nec.webotx.webcontainer.EnableCheckThreadLocalsForLeaks=false

プロセスグループ上にWebアプリケーションを配備している場合は、併せてプロセスグループに対して以下の設定を行います。
  • 運用管理コマンドご利用の場合
    otxadmin> add-pg-javasystem-property --apgroup ${アプリケーショングループ名} --javasystemprop com.nec.webotx.webcontainer.EnableCheckThreadLocalsForLeaks --value false ${プロセスグループ名}

  • 運用管理コンソールご利用の場合
    ドメイン > TPシステム > アプリケーショングループ > ${アプリケーショングループ名} > プロセスグループ > ${プロセスグループ名} > [Javaシステムプロパティ]タブ > Javaシステムプロパティ
    以下の値を追加します。
    名前:com.nec.webotx.webcontainer.EnableCheckThreadLocalsForLeaks
    値 :false

設定変更後はドメインを再起動します。

※V9.11, V9.20, V9.21について、本回避方法は以下のバージョン以降で有効
   ですので、最新パッチを適用後、本回避策の実施をお願いします。

  V9.11: V9.11.00.02以降
  V9.20: V9.20.00.01以降
  V9.21: V9.21.00.01以降

V9.10では回避方法はありません。急ぎでパッチが必要な場合はご連絡ください。


回避方法の影響

ThreadLocalのメモリリークチェックを行わない設定により、 Webアプリケーションの処理で ThreadLocal がメモリリークしている場合に 検出できなくなるという影響があります。
Webアプリケーションの処理がメモリリークしていない場合は影響はありません。

Webアプリケーションを評価してメモリリークがなければ、本番運用では 本メモリリークチェックは基本的には不要です。

Webアプリケーションの評価時に本事象が発生する可能性があることを ふまえた上でPJ側の判断により一次的にメモリリークチェックを行う 設定(EnableCheckThreadLocalsForLeaks=true)にして評価を行い、 アプリケーションを停止させて、WebOTXのログを確認します。
以下の例のようなログが出力されていなければ、本回避方法の影響はありません。

The web application [XXX] created a ThreadLocal with key of type [XXX] (value [XXX]) and a value of type [XXX] (value [XXX]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
※XXXは可変です。


更新履歴

2018/2/19 初版
2018/6/27 第2版 詳細、回避方法を更新

製品名カテゴリ

WebOTX
WebOTX Application Server
WebOTX Service Integration
WebOTX Portal

  • コンテンツID: 3010102359
  • 公開日: 2018年10月09日
  • 最終更新日:2018年10月09日
ここからページ共通メニューです。 ページ共通メニューを読み飛ばす。