サーバー上で実行するように多数のレプリケーション エージェントを構成すると、一部のSQL Serverレプリケーション エージェントを実行できない

この記事では、サーバー上で実行するように多数のSQL Serverレプリケーション エージェントを構成するときに、一部のレプリケーション エージェントを実行できない問題を回避するのに役立ちます。

元の製品バージョン: SQL Server 2014、SQL Server 2012
元の KB 番号: 949296

現象

次のような状況で問題が発生します。

  • サーバー上で実行するように、多くの Microsoft SQL Server 2014 または SQL Server 2012 レプリケーション エージェントを構成します。 たとえば、サーバー上で実行するように 200 を超えるレプリケーション エージェントを構成します。

このシナリオでは、一部のレプリケーション エージェントを実行できません。 さらに、次のエラー メッセージがシステム ログに記録されます。

アプリケーション エラー: アプリケーションを正しく初期化できませんでした (0xc0000142)。
[OK] をクリックしてアプリケーションを終了します。

原因

この問題は、デスクトップ ヒープが使い切れているために発生します。

回避策

この問題を回避するには、次のいずれかの方法を使用します。

異なるデータベース用に作成されたレプリケーション エージェントに個別のアカウントを使用する

これは、レプリケーション エージェントの作成時に指定できます。 すべてのアクセス許可タッチ ポイントが処理されていることを確認する必要があります。 既に作成されているレプリケーション エージェントのセキュリティ設定を変更する手順については、「レプリケーション セキュリティ 設定の表示と変更」を参照してください。

レジストリ設定を使用してデスクトップ ヒープ サイズを増やす

次のレジストリ エントリを変更できます。

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\SessionViewSize (たとえば、値を 48 から 64 に増やします)。

  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows (たとえば、 の 3 番目の SharedSection 値を 256 キロバイト増やします)

両方のノードに変更を適用する必要があります。 変更の前にレジストリ キーを保存する必要があり、変更を適用した後にサーバーを再起動する必要があります。

レプリケーション エージェントを継続的に実行からスケジュールされたベースで実行するように変更する

これにより、レプリケーション エージェントは必要な場合にのみ実行され、アイドル状態を常に維持しないようにします (リソースが無駄になるため)。

レプリケーション エージェントのスケジュールを変更する方法については、「 同期スケジュールの指定」を参照してください。

レプリケーション エージェントが実行されているサーバーの場所を変更する

パブリッシャーとサブスクライバーのペアを評価し、パブリッシャーではなくサブスクライバーでディストリビューション/マージ エージェントを実行するプルするように一部のサブスクライバーを変更できるかどうかを確認できます。 これにより、サーバー上で実行する必要がある同時実行エージェントの数を減らすことができます。

状態

この動作は仕様です。

デスクトップ ヒープの使用方法を調べる方法

SQL Server エージェント サービスを開始する各アカウントは、非アクティブな 1 つのデスクトップ ヒープに対応します。 さらに、SQL Server エージェント サービスによって管理されるすべてのレプリケーション エージェントは、アカウントのデスクトップ ヒープを共有します。

デスクトップ ヒープ モニター ツールを使用して、デスクトップ ヒープの使用を調べることができます。 次に、非対話型デスクトップ ヒープのサイズを増減する必要があるかどうかを決定できます。 通常、サイズを大きくする必要があります。

重要

デスクトップ ヒープ モニター ツールは、Windows Server 2008 以降のバージョンの Windows では機能しません。 これらのバージョンの Windows のいずれかを使用している場合は、LiveKD を使用してデスクトップ ヒープ値を取得できます。 これを行う方法については、次のセクションを参照してください。

デスクトップ ヒープ モニター ツールを使用してデスクトップ ヒープの使用を調べるには、次の手順に従います。

  1. デスクトップ ヒープ モニター ツールをダウンロードします。

  2. デスクトップ ヒープ モニター ツールをインストールします。 これを行うには、次の手順を実行します。

    1. パッケージをダブルクリックしてファイルを抽出します。

    2. [ スタート] をクリックし、[ 実行] をクリックし、「 cmd」と入力して、[OK] をクリック します

    3. コマンド プロンプトで、次のコマンドを実行します。

      CD ExtractFolder\kktools\dheapmon8.1\Platform
      

      注:

      ExtractFolder は、ファイルを抽出するフォルダーのプレースホルダーです。 Platform は、特定のプラットフォームに対応するフォルダーの名前のプレースホルダーです。

    4. 次のコマンドを実行します。

      dheapinst.exe -y srv*http://msdl.microsoft.com/download/symbols
      
  3. ドライバーを読み込みます。 このためには、次のコマンドを実行します。

    dheapmon.exe -l
    
  4. デスクトップ ヒープ モニター ツールを実行します。 このためには、次のコマンドを実行します。

    dheapmon.exe -s
    

出力は次のようになります。

Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation. All rights reserved.
-------------------------------------------------------------
Session ID: 0
Total Desktop: ( 7872 KB - 12 desktops)
WinStation\Desktop Heap Size(KB) Used Rate(%)
-------------------------------------------------------------
WinSta0\Default 3072 24.2
WinSta0\Disconnect 64 4.5
WinSta0\Winlogon 128 10.0
Service-0x0-3e7$\Default 512 40.9
Service-0x0-3e4$\Default 512 10.0
Service-0x0-3e5$\Default 512 6.9
SAWinSta\SADesktop 512 0.5
__X78B95_89_IW\__A8D9S1_42_ID 512 0.5
Service-0x0-1d419$\Default 512 2.4
Service-0x0-1da0b$\Default 512 2.4
Service-0x0-25c2e$\Default 512 13.5
Service-0x0-2461f$\Default 512 98.6
-------------------------------------------------------------

この出力では、アイテムはService-0x0-2461f$\Default、SQL Server エージェント サービスを開始するアカウントを表します。 すべてのレプリケーション エージェントは、このアカウントのセキュリティ コンテキストで実行されます。 より多くのレプリケーション エージェントを実行すると、デスクトップ ヒープの使用が増えます。 デスクトップ ヒープの使用が 98% または 99% を超える場合は、デスクトップ ヒープ リソースを割り当てられません。 そのため、新しいレプリケーション エージェントを起動することはできません。

この出力では、アカウントのデスクトップ ヒープの使用は 98.6% です。 この状況では、パラメーターの 3 番目の値を増やすことで、非インターアクティブデスクトップ ヒープのサイズを SharedSection 大きくします。 3 番目の値を増やすと、サーバーを再起動した後に問題が解決されます。 次に、デスクトップ ヒープ モニター ツールを使用して、新しい値がすべてのレプリケーション エージェントに対応しているかどうかを調べることができます。

デスクトップ ヒープの使用は、80% から 90% の間で維持することをお勧めします。 パラメーターの 3 番目の値を SharedSection 増やす場合は、毎回値を 512 ずつ増やすことをお勧めします。

LiveKD を使用してデスクトップ ヒープ値を列挙する手順

  1. SDK の一部として Windows 用デバッグ ツールをダウンロードします。

  2. を実行 Sdksetup.exeし、Windows 用デバッグ ツールをインストールします。

  3. LiveKD をダウンロードします

  4. フォルダーを C:\debugger 作成します。

  5. デバッグ ツールをインストールした場所から すべてのファイルを に C:\debuggerコピーします。 既定のパスは です C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x64

  6. LiveKD を に抽出します C:\debugger

  7. 管理者特権のアクセス許可を持つコマンド プロンプトを開きます。

  8. コマンド プロンプトから次のコマンドを実行します。

    livekd -y srv*http://msdl.microsoft.com/download/symbols
    
  9. 次のような出力を受け取る必要があります。

    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
    
  10. を実行 !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
    ============================================================
    
  11. 次の操作を実行して、暗号化されたログオンをデコードします。

    1. "3e5$Service-0x0- 3e5 $\Default" -> 0x3e5 == 997.

    2. Windows の [実行] コマンドから wbemtest を開きます。

    3. 名前空間に接続します root\cimv2

    4. [ クエリ] をクリックし、「」と入力 select * from win32_logonsessionします。

    5. 997 を含むエントリをダブルクリックします。

    6. オブジェクト エディターで [UUID] を 選択し、[ 関連付け] をクリックして実際のログオン名を表示します。 次のスクリーンショットを参照してください。

      実際のログオン名を検索する手順のスクリーンショット。

リモート デスクトップ プロトコルを使用する場合の考慮事項

リモート デスクトップ プロトコル (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 2005 のジョブがデスクトップ ヒープに与える影響

SQL Server 2005 では、異なるプロキシ アカウントで実行されるジョブが異なる場合があります。 プロキシ アカウントごとに、そのプロキシ アカウントの非対話型デスクトップ ヒープが割り当てられます。 たとえば、SharedSection パラメーターの 3 番目の値は 512 です。 プロキシ アカウントを使用してジョブを開始する場合、ジョブ自体がデスクトップ ヒープの 10 KB のみを使用している場合でも、512 KB のデスクトップ ヒープが割り当てられます。

注:

同じプロキシ アカウントを使用する他のジョブでも、このデスクトップ ヒープが使用されます。

これにより、SQL Server エージェント サービスの起動時に多くのデスクトップが発生する可能性があります。 したがって、48 MB のバッファー・アドレス・スペースが使用される場合があります。 デスクトップ ヒープ モニター ツールを使用してデスク ヒープの使用を調べると、1 つのデスクトップが実行中のジョブで使用される 1 つのプロキシ アカウントに対応していることがわかります。 48 MB の制限に達しないように、使用するプロキシ アカウントの数を減らすることをお勧めします。

関連情報

パラメーターの値の SharedSection 詳細については、「 User32.dll または Kernel32.dll が初期化に失敗する」を参照してください。