HOWTO: Windows上のWrapperで複数のサービスを動作させる方法

対応バージョン :1.0.0
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSX (未対応)Linux (未対応)IBM AIX (未対応)FreeBSD (未対応)HP-UX (未対応)Solaris (未対応)IBM z/Linux (未対応)
対応バージョン :1.0.0
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :Windows (未対応)Mac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Windows上でWrapperをインストールしてサービスを開始すると、 複数のサービスを開始できない、という問題に遭遇する場合があります。

その場合の通常の表示メッセージは:

  • アプリケーション開始で、ほぼ即座にタイムアウトが発生しました。  「エラー1053: サービスが開始に応答しませんでした、あるいはタイミングよくリクエストをコントロールできませんでした」

  • サービスを開始しましたが、(内部DLLの読み込み失敗のため)そのJVMは即座に終了コード6で終了しました。

  • サービスを開始しましたが、コンソールの配置に失敗しました。

各サービスでは、APIエレメントなどを保存するのに利用する内部デスクトップヒープ領域から、一定量のメモリを割り当てています。 内部デスクトップヒープに関する説明は、外部サイトをご覧ください。 もしサービスが非対話サービスとして起動されると、WindowsXP 32ビット版上で、ヒープ量はデフォルトで512KBです。 Wrapper自体では、開始時に各インスタンスごとに、およそ10-15KBを割り当てます。 各JVMでもまた、およそ20KBを割り当てますが、この値はJVMが読み込むAPIエレメント次第で異なります。 もしサービスの開始時にヒープ領域が枯渇した場合、結果として上記のようなエラーが発生することがあります。

マイクロソフトから提供されている 『デスクトップヒープモニター』 ツールで、デスクトップヒープを診断することができます。 インストールして設定した出力は、このように見えるはずです:

dheapmon.exe
Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation.  All rights reserved.
-------------------------------------------------------------
  Session ID:    0 Total Desktop: (  5824 KB -    7 desktops)

  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
  WinSta0\Default                    3072              8.2
  WinSta0\Disconnect                   64              4.5
  WinSta0\Winlogon                    128              9.8
  Service-0x0-3e7$\Default            512             28.8
  Service-0x0-3e4$\Default            512              2.1
  Service-0x0-3e5$\Default            512              3.1
  SAWinSta\SADesktop                 1024              0.3
-------------------------------------------------------------

非対話サービスは、SYSTEMユーザーとして動作しますが、 この例の場合、Service-0x0-3e7$\Defaultに属します。 さらに非対話サービスを(SYSTEMユーザーとして)開始すると、徐々にヒープ利用量が増加します。 対話サービスとして動作しているサービスでは、WinSta0\Defaultヒープ利用量が増加します。 あるユーザーアカウントでサービスを利用すると、そのプロセス用に新しく WinStation\Desktopセッションを作成します。 そのユーザーとして動作するサービスは、どれでも実際には自身のセッションを受信します。

現在のところ2つの回避策があります:

  • あるサービスユーザーアカウントとして動作させること。 動作する各サービスは、48MBまで自身のセッションを受信し、全体的に32ビット版マシン上で有効です。

  • マイクロソフトの手順書どおり、 ローカルマシン上で非対話デスクトップヒープ量を増加させる。

Windows 64ビット版では、非常に大きなデスクトップヒープ領域があるため、 最終的に限界に達するには大量に同時にサービスと動作させる必要があります。