概要
- システムは、SQL Server プロセスのワーキング セットをページ アウトしません。
- 物理 I/O の必要性を減らすために、必要なデータベース ページをメモリ内で使用できます。
現象
- SQL Server のパフォーマンスが急激に低下します。
- SQL Server を実行しているコンピュータが短時間応答を停止します。
- SQL Server に接続するアプリケーションに対してタイムアウトが発生します。
- 問題は、単純なコマンドを実行したり、システム上でアプリケーションを使用したりすると発生します。
DateTime Server Resource Monitor (0x13c43) Worker 0x0412C1E8 appears to be non-yielding on Node 0. Memory freed: 34152 KB. Approx CPU Used: kernel 171 ms, user 140 ms, Interval: 125093.DateTime Server * *******************************************************************************DateTime Server * BEGIN STACK DUMP:DateTime Server * DateTime spid 0DateTime Server * Non-yielding Resource MonitorDateTime Server * *******************************************************************************DateTime Server * *******************************************************************************DateTime Server * BEGIN STACK DUMP:DateTime Server * DateTime spid 0DateTime Server * Non-yielding IOCP ListenerDateTime Server * *******************************************************************************DateTime spid2s LazyWriter: warning, no free buffers found.DateTime spid4s AppDomain xx (SQLCLR.dbo[runtime].xx) is marked for unload due to memory pressure.DateTime spid4s AppDomain xx (SQLCLR.dbo[runtime].xx) unloaded.DateTime Logon Error: 17189, Severity: 16, State: 1.DateTime Logon SQL Server failed with error code 0xc0000000 to spawn a thread to process a new login or connection. Check the SQL Server error log and the Windows event logs for information about possible related problems. [CLIENT: xx.xxx.xx.xx]Event Type:ErrorEvent Source:SQLBrowserEvent ID:8Description: The SQLBrowser service was unable to process a client request.
これらのエラー メッセージまたは警告のいずれかに気付いた場合は、この資料に記載されている SQL Server ワーキング セットのページングを考えられる原因の 1 つとして検討してください。 これらの追加のエラー メッセージまたは警告は、他のさまざまな条件または原因により、ログに記録される可能性があります。
原因
この問題は、Windows オペレーティング システムが SQL Server プロセスのワーキング セットをページ アウトするために発生します。
これらのエラー メッセージは、SQL Server プロセスのワーキング セットが、SQL Server プロセスにコミットされているメモリの 50% 以下に達するとログに記録されます。 これらのエラー メッセージを使用すると、Windows オペレーティング システムが SQL Server プロセスのワーキング セットをページ アウトするため、SQL Server のパフォーマンスが大幅に低下するケースを特定できます。 さらに、これらのエラー メッセージは、最初の 30 分間に 5 分ごとにログに記録されます。 最初の 30 分後、これらのエラー メッセージの頻度は、頻度が 1 日の最大値に達するまで 2 倍になります。
この問題が発生すると、システム上の他のアプリケーションのワーキング セットも同時にページ アウトされます。
詳細については、次を参照してください。
これとは別に、このエラー メッセージのインスタンスが表示される可能性がある既知の問題が SQL Server に存在します。 エラー メッセージは、SQL Server の起動プロセス中に SQL Server エラー ログに記録されます。 エラー メッセージは、誤った警告である可能性があります。 したがって、ワーキング セットのトリムが実際に発生したことを示さない場合があります。 詳細については、次を参照してください。
SQL Server は、初期起動フェーズ中にワーキング セット トリム警告メッセージを報告します。
VM 設定でメモリの割り当てを超えています。 たとえば、HyperV または VMWare バルーン ドライバーの問題です。 詳細については、次を参照してください。
1003470 バルーン ドライバーがメモリを保持し続けるため、仮想マシン ゲスト オペレーティング システムのパフォーマンスの問題が発生する
2001003 ESX/ESXi 仮想マシンのパフォーマンスの問題のトラブルシューティング
回避策
この問題を回避する前に、「この問題のトラブルシューティング方法」に記載されている手順を実行して、この問題を解決してください。
この問題が引き続き発生する場合は、物理メモリ内のバッファー プールに割り当てられているメモリをロックすることによって、Windows オペレーティング システムが SQL Server プロセスのバッファー プール メモリをページングしないようにできます。 メモリをロックするには、SQL Server サービスのスタートアップ アカウントとして使用されるユーザー アカウントにメモリ内のページをロックするユーザー権利を割り当てます。
注: メモリ内でページをロックすると、SQL Server によって管理されるメモリがページ アウトされません。 ただし、スレッド スタック、EXE および任意の DLL イメージ、ヒープ メモリ、CLR メモリは、OS によってページ アウトできます。
注: SQL Server 2008 SP1 用の累積的な更新プログラム 2 以降、SQL Server Standard および Enterprise Edition の両方で、メモリ内のページをロックするユーザー権利を使用できます。 ロックされたページのサポートの詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
- [スタート] ボタンをクリックし、[実行] をクリックします。次に、「gpedit.msc」と入力し、[OK] をクリックします。
注:
[グループ ポリシー] ダイアログ ボックスが表示されます。 - [コンピューターの構成] を展開し、[Windows の設定] を展開します。
- [セキュリティの設定] を展開し、
[ローカル ポリシー] を展開します。 - [ユーザー権利の割り当て] をクリックし、[メモリ内のページをロックする] をダブルクリックします。
- [ローカル セキュリティ ポリシーの設定] ダイアログ ボックスで、[グループとユーザーの追加] をクリックします。
- [ユーザーまたはグループの選択] ダイアログ ボックスで、Sqlservr.exe ファイルを実行するアクセス許可を持つアカウントを追加し、
[OK] をクリックします。 - [グループ ポリシー] ダイアログ ボックスを閉じます。
- SQL Server サービスを再開します。
起動時に SQL Server エラー ログに次のメッセージが書き込まれるようにすることで、ユーザー権利が SQL Server のインスタンスで使用されていることを検証できます。
詳細情報
この問題のトラブルシューティング方法
この問題が発生する可能性があるカテゴリは、大きく分けて 3 つあります。
- アプリケーション関連の問題: すべてのアプリケーションが一緒に使用可能な物理メモリを使い果たし、OS はリソースに対する新しいアプリケーション要求のためにメモリを解放する必要があります。 通常、ここでのアプローチは、メモリを使い果たしているアプリケーションを見つけ、RAM の枯渇につながることなく、メモリ間でメモリのバランスを取るために必要な手順を実行することです。
- デバイス ドライバーの問題: デバイス ドライバがメモリ割り当て関数を誤って呼び出すと、すべてのプロセスのワーキング セット ページングが発生することがあります。
- オペレーション システムの問題
- アプリケーション関連の問題:
アプリケーションを組み合わせると、システム上のすべての RAM が消費される場合があります。 新しいメモリ要求が行われた場合、OS はそれらを満たす必要があり、空きメモリがない場合は、実行中のアプリケーションのワーキング セットをトリミングしてメモリ要求を満たします。 このように、すべてのアプリケーションが大幅に低下するわけではない場合、ほとんどのアプリケーションのワーキング セットが大幅に低下することがあります。 これを確認するには、システム上のすべてのアプリケーションに対して次のパフォーマンス モニター カウンターを収集します。
パフォーマンス オブジェクト: 処理
カウンター: ワーキング セットまた、次のカウンターを監視して、システムで使用可能な物理メモリの量を関連付けます。
パフォーマンス オブジェクト: メモリ
カウンター: 使用可能なメモリ (MB)一般的な動作は、使用可能なメモリを 0 MB に近づけると同時に、システム上のほとんどの (すべての) プロセスに対してワーキング セット カウンターを突然ドロップすることです。 このような現象が発生した場合は、SQL Server の最大サーバー メモリの削減など、システムのメモリ使用量を減らすための手順が必要になる場合があります。
アプリケーションはシステム キャッシュを使用しすぎて、システム キャッシュの増加を引き起こす可能性があります。 システム キャッシュの増加に対応するために、システムは SQL Server プロセスまたは他のアプリケーションのワーキング セットをページ アウトします。 この問題が発生した場合は、アプリケーションでいくつかのメモリ管理機能を使用できます。 これらの関数は、ファイル I/O 操作がアプリケーションで使用できるシステム キャッシュ領域を制御します。 たとえば、ファイル I/O 操作で使用できるシステム キャッシュ領域を制御するために、SetSystemFileCacheSize 関数と GetSystemFileCacheSize 関数を使用できます。
Memory パフォーマンス オブジェクトを使用すると、このオブジェクトのさまざまなカウンターの値を表示して、システム キャッシュ ワーキング セットがメモリを使用しすぎているかどうかを判断できます。 たとえば、[キャッシュ バイト] カウンターと [システム キャッシュ常駐バイト] カウンターを表示できます。 この方法の詳細については、以下の Microsoft Web サイトを参照してください。キャッシュが多すぎます
Microsoft Windows Dynamic Cache Service
976618 システム ファイル キャッシュが物理 RAM の大部分を消費すると、アプリケーションとサービスでパフォーマンスの問題が発生する"Microsoft Windows Dynamic Cache Service" をダウンロードして展開すると、システム キャッシュによって消費されるメモリを制御できます。
- デバイス ドライバーの問題:
デバイス ドライバーは、MmAllocateContiguousMemory 関数を使用し、 HighestAcceptableAddress パラメーターの値を4 GB 未満に設定した場合、Windows オペレーティング システムは、SQL Server プロセスを含むシステム上のプロセスのワーキング セットをページ アウトする可能性があります。 この問題を解決するには、デバイス ドライバーの製造元に問い合わせて、ドライバーの更新を確認してください。
デバイス ドライバーがメモリを割り当てようとすると、Windows オペレーティング システムが他のアプリケーションのワーキング セットをページ アウトすることがあります。 この Windows 修正プログラムを使用すると、イベント トレースを使用して、問題の原因となっているデバイス ドライバーを見つけることができます。 ワーキング セットのトリミング動作を引き起こす特定のドライバーの詳細については、MSDN の記事「連続したメモリを割り当てるドライバーの識別」を参照してください。
- オペレーション システムの問題:
Windows オペレーティング システムが SQL Server プロセスのワーキング セットをページ アウトする原因となる既知の問題を解決するには、次の Microsoft サポート技術情報資料に記載されている修正プログラムを適用します。注: 修正プログラムは累積的です。 新しいバージョンの修正プログラムには、以前のバージョンの修正プログラムが含まれています。
- システムが高度な TCP 機能を使用している場合、SQL Server セットがトリミングされることがあります。 詳細については、以下のサポート技術情報番号をクリックしてください。
942861 Windows Server を実行しているサーバー上の SQL Server にアプリケーションが接続するときにエラー メッセージ: "一般的なネットワーク エラー"、"通信リンクの障害" または "トランスポート レベルのエラー"
- Windows Server 2003 を実行しているマルチプロセッサ コンピューターでは、システム プロセスが使用可能なシステム メモリの大部分を消費することがあります。 詳細については、以下のサポート技術情報番号をクリックしてください。
942486 システム プロセスは、Windows Server 2003 を実行しているマルチプロセッサ コンピューターで使用可能なシステム メモリのほとんどを消費する可能性があります。
- SQL Server が SAP R/3 と共に実行されている場合、ページングの問題が発生する可能性があります。 詳細については、以下のサポート技術情報番号をクリックしてください。
931308 Windows Server 2003 ベースのコンピューターで SAP R/3 プログラムを実行すると、ハード ディスクへのページングが増加することがある
- Windows Server 2008 で SQL Server を実行している場合は、ワーキング セットのトリミングや、他のオペレーティング システム コンポーネントによる不要な過剰なメモリ消費につながる可能性のある既知の問題に対する修正プログラムを適用する必要があります。 関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
971714 Windows Server 2008 ベースのドメイン コントローラーでレポートを生成する Active Directory 診断テンプレートを使用して Perfmon.exe を実行すると、レポート生成プロセスが応答を停止することがある
- Windows Server 2008 R2 で SQL Server を実行している場合は、ワーキング セットのトリミングにつながる可能性のある既知の問題に対する修正プログラムを適用する必要があります。 関連情報を参照するには、次のサポート技術情報番号をクリックしてください。
979149 大きなアプリケーションを実行すると、Windows 7 またはWindows Server 2008 R2 を実行しているコンピューターが応答しなくなる
2155311 NUMA ベースのプロセッサを搭載し、スレッドが最初の 4 GB のメモリ内にある大量のメモリを要求した場合に Windows Server 2008 R2 または Windows 7 を実行しているコンピューターでパフォーマンスが低下する
2468345 Storportドライバーが Windows Server 2008 R2 で使用されていると、コンピューターのパフォーマンスが断続的に低下するか応答しなくなる
SQL Server で使用されているメモリを確認する方法
パフォーマンス モニタを使用すると、メモリ内のロックされたページが有効になっていない場合に SQL Server が使用するメモリを表示できます。
SQL Server は、次のパフォーマンス カウンターを使用して、バッファ プールが割り当てるメモリを公開します。
パフォーマンス オブジェクト: SQL Server: Memory Manager
カウンター: 合計サーバー メモリ (KB)
注: SQL Server のインスタンスが名前付きインスタンスの場合、パフォーマンス オブジェクトの名前は次のようになります。
MSSQL$InstanceName: メモリ マネージャ
さらに、次のパフォーマンス カウンターを監視することで、SQL Server に対するページングの影響を測定できます。
パフォーマンス オブジェクト: 処理
カウンター: プライベート バイト
インスタンス: sqlservr
パフォーマンス オブジェクト: 処理
カウンター: ワーキング セット
インスタンス: sqlservr
プライベート バイト カウンターは、現在コミットされている仮想メモリを測定します。 ワーキング セット カウンターは、現在コミットされている仮想メモリの容量が物理メモリ (RAM) を占有しているかを測定します。
ワーキング セット カウンターの値が合計サーバー メモリ (KB) カウンター (またはプライベート バイト) の値より小さい場合は、少なくともバッファ プールの一部であるメモリの一部が SQL Server ワーキング セットからトリミングされました。
また、ディスクに対して読み取りおよび書き込みページを示す次のパフォーマンス カウンターを監視することで、システム全体のページング (ワーキング セット トリミング) を確認することもできます。
パフォーマンス オブジェクト: メモリ
カウンター: ページ入力 / 秒とページ出力 / 秒
このカウンターを使用してメモリページを特定する方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
- パフォーマンス モニターのプライベート バイト カウンターとワーキング セット カウンター
- タスク マネージャーの [プロセス] タブの [メモリ使用量] 列
SQL Server のインスタンスに "メモリ内のページをロックする" ユーザー権利を割り当てる前の重要な考慮事項
メモリ内のページをロックするユーザー権利を割り当てる前に、追加の考慮事項を考慮する必要があります。 正しく構成されていないシステムでこのユーザー権利を割り当てると、システムが不安定になったり、システム全体のパフォーマンスが低下したりする可能性があります。 アプリケーション ログにイベント ID 333 が記録されることがあります。これらの問題について Microsoft カスタマー サポート サービス (CSS) に問い合わせると、CSS エンジニアから、SQL Server サービスのスタートアップ アカウントとして使用されているユーザー アカウントに対するこのユーザー権利の取り消しを求めるメッセージが表示されることがあります。 この手順は、CSS エンジニアが SQL Server のさまざまなオプションやシステムで実行されている他のアプリケーションに必要な構成に使用できる重要なパフォーマンス データを収集するために必要な場合があります。 CSS エンジニアがパフォーマンス データを収集 したら、SQL Server サービスのスタートアップ アカウントにメモリ内のページをロックするユーザー権利を割り当てることができます。
メモリ内のページをロックするユーザー権利を割り当てる前に、パフォーマンス モニタ ログをキャプチャして、システムにインストールされているさまざまなアプリケーションやサービスのメモリ要件を判断してください。 これらのアプリケーションには、 SQL Server も含まれます。 メモリ要件を確認するには、次のベースライン情報を収集します。
- 最大サーバー メモリ オプションと最小サーバー メモリ オプションが正しく設定されていることを確認します。 これらのオプションは、SQL Server プロセスのバッファー プールのメモリ要件のみを反映します。 これらのオプションには、SQL Server プロセス内の他のコンポーネントに割り当てられているメモリは含まれません。 これらのコンポーネントは以下のとおりです。
- SQL Server ワーカー スレッド
- SQL Server プロセスが SQL Server プロセスのアドレス空間内に読み込むさまざまな DLL およびコンポーネント
- バックアップと復元操作
- DLL とコンポーネントには、さまざまな OLE DB プロバイダ、拡張ストアド プロシージャ、sp_OACreate ストアド プロシージャに使用される Microsoft COM オブジェクト、リンク サーバーおよび SQL Server CLR が含まれます。 これらのコンポーネントに割り当てられるメモリは、SQL Server プロセスのアドレス空間の非バッファ プール領域に含まれます。 SQL Server プロセス全体が使用できるメモリの最大量を決定するには、SQL Server プロセスで使用するメモリの合計から、バッファ プールを使用しないコンポーネントに割り当てられているメモリを減算する必要があります。 次に、残りの値を使用して 最大サーバー メモリ オプションを設定できます。 最大サーバー メモリ オプションと最小サーバー メモリ オプションを設定する前に、SQL Server オンライン ブックの「メモリ オプションを手動で設定する」を慎重に確認する必要があります。
- 他のアプリケーションおよび Windows オペレーティング システム コンポーネントのメモリ要件を確認します。 アプリケーションには、SQL Server エージェント、SQL Server レプリケーション エージェント、SQL Server レポート サービス、SQL Server 分析サービス、SQL Server 統合サービス、SQL Server フルテキスト検索などの他の SQL Server コンポーネントが含まれる場合があります。 バックアップ操作とファイル コピー操作を実行するアプリケーションは、大量のメモリを使用する可能性があります。 一括コピーや、ファイル IO を生成するスナップショット エージェントなどの操作を検討します。 最大サーバー メモリ オプションと最小サーバー メモリ オプションの値を決定する場合は、これらすべてのアプリケーションのメモリ要件を考慮する必要があります。 すべてのプロセスに対して、オブジェクトの処理の下にあるプライベート バイト カウンターとワーキング セット カウンターを使用して、特定のプロセスのメモリ要件を判断できます。
- 既定では、メモリ内のページのロックユーザー権利は、組み込みのローカル システム アカウントに既に割り当てられています。 詳細については、次のマイクロソフト Web サイトを参照してください。
- ドメイン内のすべての SQL Server プロセスに対して Windows ユーザー アカウントをグローバルに使用する場合は、グループ ポリシー構成を使用して割り当てられているユーザー権利を決定します。 32 ビット SQL Server プロセスでは、このアカウントをスタートアップ アカウントとして使用できます。 ただし、このアカウントでは、アドレス ウィンドウ拡張機能 (AWE) 機能を有効にするために、メモリ内のページをロックするユーザー権利が必要です。 詳細については、SQL Server オンライン ブックの「SQL Server への最大メモリ量の提供」を参照してください。
- 複数のSQL Server インスタンスに対して 最大サーバー メモリ オプションと 最小サーバー メモリ オプションを構成する前に、SQL Server の各インスタンスの非バッファ プールのメモリ要件を考慮してください。 次に、SQL Server のインスタンスごとに、これらのオプションを構成します。
理想的には、ピーク負荷時にこのベースライン情報を収集します。 したがって、ピーク時の負荷をサポートするために、さまざまなアプリケーションおよびコンポーネントのメモリ要件を決定できます。 メモリー要件は、システム上で実行されているアクティビティーおよびアプリケーションによって、システムごとに異なります。
動的管理ビュー sys.dm_os_process_memory で提供される情報を照会して、システムでメモリ不足状態が発生しているかどうかを確認できます。 詳細については、次のサイトの SQL Server Books Online リファレンスを参照してください。
sys.dm_os_process_memory (Transact-SQL)
ワーキング セットのトリミングを減らす Windows Server 2008 および Windows Server 2008 R2 で追加された機能強化
Windows Server 2008 および Windows Server 2008 R2 では、連続したメモリ割り当てメカニズムが向上します。 この機能強化により、Windows Server 2008 および Windows Server 2008 R2 は、新しいメモリ要求が到着したときにアプリケーションのワーキング セットをページングする場合の影響をある程度軽減できます。
Microsoft のホワイト ペーパー「Windows におけるメモリ管理の進歩」の機能強化について説明します。
この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。