この記事は、サーバー上で実行するように多数の SQL Server レプリケーション エージェントを構成するときに、一部のレプリケーション エージェントを実行できない問題を回避するのに役立ちます。
元の製品バージョン: SQL Server
元の KB 番号: 949296
現象
以下のシナリオについて考えてみます。
- サーバー上で実行するように、多くの Microsoft SQL Server レプリケーション エージェントを構成します。 たとえば、サーバー上で実行するように 200 を超えるレプリケーション エージェントを構成します。
このシナリオでは、一部のレプリケーション エージェントを実行できません。 さらに、次のエラー メッセージがシステム ログに記録されます。
アプリケーション エラー: アプリケーションを正しく初期化できませんでした (0xc0000142)。
[OK] をクリックしてアプリケーションを終了します。
原因
この問題は、デスクトップ ヒープが使い切っているために発生します。
回避策
この問題を回避するには、次のいずれかの方法を使用します。
異なるデータベース用に作成されたレプリケーション エージェントに個別のアカウントを使用する
これは、レプリケーション エージェントの作成時に指定できます。 すべてのアクセス許可のタッチ ポイントが管理されていることを確認する必要があります。 既に作成されているレプリケーション エージェントのセキュリティ設定を変更する手順については、 View で確認し、レプリケーションのセキュリティ設定を変更します。
レジストリ設定を使用してデスクトップ ヒープ サイズを増やす
次のレジストリ エントリを変更できます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\SessionViewSize
(たとえば、値を 48 から 64 に増やします)。HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
(たとえば、SharedSection
の 3 番目の値を 256 KB 増やします)
両方のノードに変更を適用する必要があります。 変更前にレジストリ キーを保存する必要があり、変更を適用した後にサーバーを再起動する必要があります。
レプリケーション エージェントを継続的に実行からスケジュールに基づいて実行するように変更する
これにより、レプリケーション エージェントは必要なときにのみ実行され、アイドル状態を常に維持しないようにします (リソースが無駄になるため)。
レプリケーション エージェントのスケジュールを変更する方法については、 Specify 同期スケジュールを参照してください。
レプリケーション エージェントが実行されているサーバーの場所を変更する
パブリッシャーとサブスクライバーのペアを評価し、パブリッシャーではなくサブスクライバーでディストリビューション/マージ エージェントを実行するプルするように一部のサブスクライバーを変更できるかどうかを確認できます。 これにより、サーバーで実行する必要がある同時実行エージェントの数を減らすことができます。
状態
この動作は仕様によるものです。
LiveKD を使用してデスクトップ ヒープ値を列挙する手順
SDK の一部として Debugging Tools for Windows をダウンロード。
Sdksetup.exe
を実行し、Windows 用デバッグ ツールをインストールします。LiveKD をダウンロードします。
C:\debugger
フォルダーを作成します。デバッグ ツールをインストールした場所からすべてのファイルを
C:\debugger
にコピーします。 既定のパスは、C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x64
です。LiveKD を抽出して
C:\debugger
します。管理者特権のアクセス許可を持つコマンド プロンプトを開きます。
コマンド プロンプトで、次のコマンドを実行します。
livekd -y srv*http://msdl.microsoft.com/download/symbols
次のような出力が表示されます。
LiveKd v5.3 - Execute kd/windbg on a live system Sysinternals -[www.sysinternals.com](http://www.sysinternals.com/) Copyright (C) 2000-2012 Mark Russinovich and Ken Johnson Launching C:\Debugger\kd.exe: Microsoft (R) Windows Debugger Version 6.2.9200.20512 AMD64 Copyright (c) Microsoft Corporation. All rights reserved. Loading Dump File [C:\Windows\livekd.dmp] Kernel Complete Dump File: Full address space is available Comment: 'LiveKD live system view' Symbol search path is: srv*http://msdl.microsoft.com/download/symbols Executable search path is: Product: Server, suite: Built by: Machine Name: Kernel base = Debug session time: System Uptime: Loading Kernel Symbols ............................................................... Loading User Symbols ................................................... Loading unloaded module list ......Unable to enumerate user-mode unloaded modules, NTSTATUS 0xC0000147
!dskheap
を実行して、次の出力を受け取ります。kd> !dskheap *** ERROR: Module load completed but symbols could not be loaded for LiveKdD.SYS Winstation\Desktop Heap Size(KB) Used Rate(%) ------------------------------------------------------------ WinSta0\Default 20480 0% WinSta0\Disconnect 96 4% WinSta0\Winlogon 192 2% Service-0x0-3e7$\Default 768 1% Service-0x0-3e4$\Default 768 0% Service-0x0-3e5 $\Default 768 0% Service-0x0-10a75$\Default 768 0% ------------------------------------------------------ Total Desktop: (23840 KB - 7 desktops) Session ID: 0 ============================================================
次の手順を実行して、暗号化されたログオンをデコードします。
"3e5$Service-0x0- 3e5 $\Default" -> 0x3e5 == 997
。Windows の Run コマンドから wbemtest を開きます。
root\cimv2
名前空間に接続します。[ クエリ] を選択し、「
select * from win32_logonsession
」と入力します。997 を含むエントリをダブルクリックします。
オブジェクト エディターで UUID を選択し、 Associators をクリックして実際のログオン名を表示します。 次のスクリーンショットを参照してください。
リモート デスクトップ プロトコルを使用する場合の考慮事項
リモート デスクトップ プロトコル (RDP) を使用してサーバーに接続する場合は、必ず /console
スイッチを使用してコンソール セッションを作成してください。
/console
スイッチを使用しない場合、デスクトップは表示されません。 これは、SQL Server エージェント サービスを開始するアカウントがセッション 0 に関連付けられているためです。
Win32k.sys ドライバーは、デスクトップ ヒープに 48 MB のバッファー アドレス空間を割り当てます。 48 MB のバッファー アドレス空間全体を使い切るデスクトップが多くないことを確認します。
サーバーがターミナル サーバーとして構成されていない場合、すべてのデスクトップ ヒープは 48 MB のバッファー アドレス空間を共有します。 これにより、サーバーで実行できるサービス プロセスの数が制限されます。
サーバーがターミナル サーバーとして構成されている場合、Win32k.sys ドライバーは、デスクトップ ヒープに 20 MB のバッファー アドレス空間を割り当てます。 また、Win32k.sys ドライバーは、独自のページ プールに 16 MB のセッション領域を割り当てます。
デスクトップ ヒープに関するターミナル サーバーとターミナル サービスの違い
ターミナル サーバーとターミナル サービスは異なります。 ターミナル サーバー コンポーネントは、 プログラムの追加と削除にインストールします。 ターミナル サーバー コンポーネントをインストールすると、サーバーがターミナル サーバーになります。 ターミナル サービスは、サービス Microsoft 管理コンソール (MMC) スナップインに存在するサービスです。 サーバーからターミナル サーバー コンポーネントを削除しても、クライアント コンピューターは RDP を使用してサーバーに接続できます。 そのため、ターミナル サーバー コンポーネントを削除して、デスクトップ ヒープの 48 MB のバッファー アドレス空間を取得することを検討してください。
SQL Server のジョブがデスクトップ ヒープに与える影響
SQL Server では、異なるプロキシ アカウントで実行されるジョブが異なる場合があります。 プロキシ アカウントごとに、そのプロキシ アカウントの非対話型デスクトップ ヒープが割り当てられます。 たとえば、SharedSection パラメーターの 3 番目の値は 512 です。 プロキシ アカウントを使用してジョブを開始すると、ジョブ自体が 10 KB のデスクトップ ヒープのみを使用している場合でも、512 KB のデスクトップ ヒープが割り当てられます。
注
同じプロキシ アカウントを使用する他のジョブでも、このデスクトップ ヒープが使用されます。
これにより、SQL Server エージェント サービスの起動時に多くのデスクトップが発生する可能性があります。 そのため、48 MB のバッファー アドレス空間が使い切れる可能性があります。 デスクトップ ヒープ モニター ツールを使用してデスク ヒープの使用を調べると、実行中のジョブで使用される 1 つのプロキシ アカウントに 1 つのデスクトップが対応していることがわかります。 48 MB の制限に達しないように、使用するプロキシ アカウントの数を減らすることをお勧めします。
関連情報
SharedSection
パラメーターの値の詳細については、「User32.dllまたはKernel32.dll初期化に失敗する」を参照してください。