福原 宗稚
Support Escalation Engineer
最近複数のお客様から、レプリケーションについて同様の事象を報告いただくことがありました。レプリケーションモニターやエージェントのヒストリーを見ても、エージェントの起動に失敗したという記録くらいしか確認できずなかなか分かりにくい事象のため、ここでご紹介します。
問題
サブスクリプションのスナップショット適用時、もしくはその後の同期において、ディストリビューション エージェントでエラーが発生します。
SQL Server エラーログや、アプリケーションイベントログには、エラー 14151が記録されます。
エラー: 14151、重大度: 18、状態: 1。 |
特徴
下記の特徴があります。これらに合致する場合には、この問題に合致していると判断できます。
1) システム イベントログに、ディストリビューションエージェントの起動後にエラー 243が 1 回記録されます。
ログの名前: System ソース: Win32k イベント ID: 243 レベル: 警告 説明: デスクトップ ヒープの割り当てに失敗しました。 |
2) 多くのサブスクリプションを設定しています。これまでの実績としては、約300個のサブスクリプションを設定している環境で発生しています。
原因
多くのディスクトリビューションエージェントが起動することによって、デスクトップヒープが枯渇することが原因です。
デスクトップヒープはアプリケーションが通常動作する際に内部的に使用されるメモリ領域です。このデスクトップヒープはサーバーの物理メモリに関係なく、OSによって固定サイズが割り当てられています。 この領域が不足すると、物理メモリ領域に空きがあっても、アプリケーションが起動しない現象が発生することがあります。
対処
以下のいずれかの方法により対応可能です。
1.デスクトップヒープのサイズを拡張する
2.サブスクリプションの定義を PUSH 型と PULL 型の2種類に分割する
3.ディストリビューションエージェントの設定を変更する
1.デスクトップヒープのサイズを拡張する
ヒープサイズを拡張する方法となります。
メリットおよびデメリット
メリット | SQL Server 側の設定を変える必要がなく、現在のシステム構成の状態で回避できることが期待できます。 |
デメリット | デスクトップヒープを極端に大きくする事はシステムのパフォーマンスに影響を与える可能性があります。 |
変更方法
1) レジストリエディタを起動し、次のレジストリに移動します。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
2) SharedSection の値を変更します。
3) OSを再起動して、変更を有効にします。
例)
設定前
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16 |
デスクトップヒープの割り当て方法は、"SharedSection=" の後に続く 3 つの数値によって制御されます。
これらの SharedSection の値は、KB 単位で指定されます。今回の事象では、以下のように、第 3 パラメーターの値を変更します。
SharedSection=1024,20480,768 -------> 変更前
↓ ↓ ↓
SharedSection=1024,20480,1024 -------> 変更後
設定後
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,1024 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16 |
(*)注: 上記設定によって、回避ができない場合、徐々に(512KBを基準に)増加させて、回避できるかどうか確認します。
2.サブスクリプションの定義を PUSH 型と PULL 型の2種類に分割する
PUSH 型では distrib.exe がディストリビューターで起動します。一方、PULL 型では distrib.exe がサブスクライバーで起動します。
起動するプロセスをディストリビューターとサブスクライバーで分散させることによって、それぞれのサーバーで実行されるプロセスを減らす方法となります。
メリットおよびデメリット
メリット | 本事象を回避し、ディストリビューターもしくはサブスクライバーで実行されるディストリビューション関連の処理を負荷分散させることが期待できます。 |
デメリット | レプリケーションの構成変更が必要になります。 |
変更方法
PUSH サブスクリプションが多い場合には、既存の PUSH サブスクリプションを削除し、PULL サブスクリプションで再作成します。
PULL サブスクリプションが多い場合には、既存の PULL サブスクリプションを削除し、PUSH サブスクリプションで再作成します。
3.ディストリビューションエージェントの設定を変更する
共有エージェントを使用することにより、ディストリビューション エージェント (distrib.exe) の数を削減する方法となります。
SQL Server は既定で独立エージェントを使用するようになっており、パブリケーション単位、サブスクリプション単位でディストリビューション エージェントが起動されます。 一方で、共有エージェントの場合には、パブリケーション データベースとサブスクリプション データベースが同一である場合にはディストリビューション エージェントを共有して利用できます。
例) パブリケーション データベースに対して 2 つのパブリケーションを作成し、それぞれが 2 つのサブスクリプション データベースへ同期を行う場合
独立エージェント : 4つのディストリビューション エージェントが起動する
共有エージェント : 2つのディストリビューション エージェントが起動する
メリットおよびデメリット
メリット | パブリケーション データベースとサブスクリプション データベースが同一の組み合わせとなるパブリケーション/サブスクリプションが存在する場合には、共有エージェントを使用できます。共有エージェントを使用するとパブリッシャー兼ディストリビューター側で実行されているディストリビューション エージェント起動プロセス数が削減でき、結果的にデスクトップ ヒープの消費を削減し、本事象を回避することが期待できます。 |
デメリット | サブスクリプションの削除、パブリケーションのプロパティ変更などの構成変更が必要になります。また、共有エージェントではキューを利用した同期処理を行うため、並列で処理が行われる独立エージェントよりも同期パフォーマンスが低下する可能性があります。 |
変更方法
共有エージェントを使用するためには、以下の手順で変更します。
1) Management Studio でパブリッシャ兼ディストリビュータの SQL Server に接続します。
2) オブジェクト エクスプローラーで [レプリケーション] フォルダを展開し、設定変更を行うパブリケーションに対するすべてのサブスクリプションをすべて削除します。サブスクリプションの削除は右クリックして [削除] を選択します。
3) パブリケーションのプロパティを開き、[サブスクリプション オプション] のページを開きます。
4) "独立したディストリビューション エージェント" を False に設定します。(*)
5) 設定変更後、あらためてサブスクリプションを作成します。
(*)注: "匿名サブスクリプションを許可" と "スナップショットが常に利用可能" のオプションが True の場合には "独立したディストリビューション エージェント" の設定を Management Studio で変更できません。その場合には、システム ストアドプロシージャ sp_changepublication により以下の順で設定を変更します。
sp_changepublication @publication = 'パブリケーション名',
@property = 'allow_anonymous',
@value = false
sp_changepublication @publication = 'パブリケーション名',
@property = 'immediate_sync',
@value = false
sp_changepublication @publication = 'パブリケーション名',
@property = 'independent_agent',
@value = false
補足
レジストリ エディタの誤った使用は、システム全般に渡る重大な問題を引き起こす可能性があります。 こうした問題を解決するためには、Windows をインストールしなおさなければいけません。 Microsoft では、レジストリ エディタを使用することによって引き起こされた障害の解決については、一切保証しておりません。 レジストリ エディタを使用する場合には、お客様の責任において使用してください。