MSSQLSERVER_17890

適用対象:SQL Server

詳細

属性
製品名 SQL Server
イベント ID 17890
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 SRV_WS_TRIMMED
メッセージ テキスト SQL Server プロセス メモリのかなりの部分がページ アウトされています。結果として、パフォーマンスが低下する可能性があります。 継続時間: %d 秒。 ワーキング セット (KB): %I64d、コミット メモリ (KB): %I64d、メモリ使用率: %d%%。

説明

SQL Server エラー ログまたは Windows アプリケーション イベント ログに、次のエラー メッセージが表示される場合があります。

SQL Server プロセス メモリのかなりの部分がページ アウトされています。結果として、パフォーマンスが低下する可能性があります。 期間:0 秒。 作業セット (KB):3383250、コミット済み (KB):9112480、メモリ使用率:37%。

また、クエリの実行および SQL Server に対するその他のすべての操作によって、パフォーマンスが急激に低下することがあります。

原因

SQL Server では、SQL Server プロセスに関するさまざまなメモリ関連情報を監視します。 このケースでは、プロセスのワーキング セットが、コミット済みプロセス メモリの 50% 未満であることが検出されました。 その結果、この警告が出力されます。 この警告の通常の原因は次のとおりです。

  • オペレーティング システムによって、SQL Server のコミット済みメモリの大部分がページング ファイルにページ アウトされています。
  • これは、他のアプリケーションやオペレーティング システムのニーズからのメモリの需要が急激に増加していることが原因である可能性があります。
  • また、これは特定のデバイス ドライバーのニーズによって、連続するメモリ割り当てが要求されるときに発生することもあります。

ユーザー アクション

物理メモリ内のバッファー プール用に割り当てられたメモリをロックすることで、Windows オペレーティング システムによって SQL Server プロセスのバッファー プール メモリがページ アウトされるのを防ぐことができます。 メモリをロックするには、SQL Server サービスの開始アカウントとして使用されるユーザー アカウントに、Lock pages in memory ユーザー権利を割り当てます。 ただし、このソリューションを実装する前に、SQL Server のインスタンスに対して "Lock pages in memory" ユーザー権利を割り当てる前に、「SQL Server メモリがページ アウトされる原因」と重要な考慮事項に関するセクションを見直してください。

注意

Lock Pages in Memory を使用すると、SQL Server によって管理されるメモリがページ アウトされないようにすることができます。ただし、スレッド スタック、EXE とあらゆる DLL イメージ、ヒープ メモリ、CLR メモリは、引き続き OS によってページ アウトされます。

SQL Server 2008 SP1 の累積的な更新プログラム 2 以降、SQL Server の Standard Edition と Enterprise Edition の両方で、Lock pages in memory ユーザー権利を使用できます。 ロックされたページのサポートの詳細については、「KB970070 - SQL Server Standard Edition (64 ビット) システムのロックされたページのサポート」を参照してください。

Lock pages in memory ユーザー権利を割り当てるには、次の手順を実行します。

  1. [スタート] ボタンをクリックし、 [ファイル名を指定して実行] をクリックして、「gpedit.msc」と入力してから、 [OK] をクリックします。
  2. [グループ ポリシー] ダイアログ ボックスが表示されます。
  3. [コンピューターの構成] を展開し、 [Windows の設定] を展開します。
  4. [セキュリティの設定] を展開し、 [ローカル ポリシー] を展開します。
  5. [ユーザー権利の割り当て] をクリックし、 [Lock pages in memory] をダブルクリックします。
  6. [ローカル セキュリティ ポリシーの設定] ダイアログ ボックスで、 [ユーザーの追加] または [グループの追加] をクリックします。
  7. [ユーザーの選択] または [グループの選択] ダイアログ ボックスで、Sqlservr.exe ファイルを実行するアクセス許可があるアカウントを追加してから、 [OK] をクリックします。
  8. [グループ ポリシー] ダイアログ ボックスを閉じます。
  9. SQL Server サービスを再開します。

Lock pages in memory ユーザー権利を割り当てて SQL Server サービスを再起動した後は、Windows オペレーティング システムで SQL Server プロセス内のバッファー プール メモリがページ アウトされなくなります。 ただし、Windows オペレーティング システムでは、引き続き SQL Server プロセス内のバッファー プール以外のメモリをページ アウトできます。

そのユーザー権利が SQL Server のインスタンスによって使用されていることを検証するには、起動時に次のメッセージが SQL Server のエラー ログに書き込まれていることを確認します。"バッファー プールにロックされたページを使用しています"

このメッセージは SQL Server にのみ適用されます。 ERRORLOG 内のこのメッセージの詳細については、「ローカル システムで Lock pages in memory の権限を割り当てる必要がありますか」にアクセスしてください。

Windows オペレーティング システムによってバッファー プール以外のメモリがページ アウトされると、パフォーマンスの問題が発生する可能性があります。 ただし、「説明」セクションに記載されているエラー メッセージは、SQL Server のエラー ログには記録されません。

SQL Server メモリがページ アウトされる原因

この問題を引き起こす可能性がある問題には、大きく次の 3 つのカテゴリに分けられます。

  • アプリケーションに関連した問題:すべてのアプリケーションで使用可能な物理メモリを使い果たし、OS で新しいアプリケーション要求のためのリソースとしてメモリを解放する必要があります。 通常、ここでのアプローチは、メモリを使い果たしているアプリケーションを検出し、RAM の枯渇を招くことなくメモリを分散するために必要な手順を実行することです。
  • デバイス ドライバーに関連した問題:ドライバーでメモリ割り当て関数が誤って呼び出されると、デバイス ドライバーによってすべてのプロセスのワーキング セットのページングが発生する可能性があります。
  • オペレーション システムに関連した問題

以下では、これらの各カテゴリに関する情報を確認できます。

  • アプリケーションに関連した問題:アプリケーションによってシステム上のすべての RAM が消費される場合があります。 メモリに対して新しい要求が行われた場合、OS ではそれらを満たそうとし、空きメモリがない場合は、実行中のアプリケーションのワーキング セットがメモリ要求を満たすようにトリミングされます。 このような場合、すべてのアプリケーションではないにしてもほとんどのワーキング セットで大幅に減少するのが見られる可能性があります。 これを確認するには、システム上のすべてのアプリケーションの次のパフォーマンス モニター カウンターを収集します。

    • パフォーマンス オブジェクト:Process
    • カウンター:Working Set

    また、次のカウンターを監視して、システムで使用できる物理メモリの量を関連付けます。

    • パフォーマンス オブジェクト:メモリ
    • カウンター:使用可能なメモリ (MB)

    見られる可能性がある典型的な動作として、使用可能なメモリが 0 MB 近くにまで減ると同時に、システム上のほとんど (すべて) のワーキング セット カウンターが突然減少することが挙げられます。 このような動作が見られる場合は、SQL Server の最大サーバー メモリを減らすことなど、システムのメモリ使用量を減らすための手順を実行する必要があることがあります。

    また、アプリケーションでシステム キャッシュが過剰に使用され、システム キャッシュが大量に増大する可能性があります。 システム キャッシュの増加に対応するために、システムでは SQL Server プロセスまたは他のアプリケーションのワーキング セットをページ アウトします。 この問題が発生した場合は、アプリケーション内でいくつかのメモリ管理関数を使用できます。 これらの関数により、アプリケーション内のファイル I/O 操作で使用できるシステム キャッシュ領域が制御されます。 たとえば、SetSystemFileCacheSize 関数と GetSystemFileCacheSize 関数を使用すると、ファイル I/O 操作で使用できるシステム キャッシュ領域を制御できます。

    メモリ パフォーマンス オブジェクトを使用すると、このオブジェクト内のさまざまなカウンターの値を表示して、システム キャッシュのワーキング セットで使用されているメモリが多すぎるかどうかを判断できます。 たとえば、Cache Bytes カウンターと System Cache Resident Bytes カウンターを表示できます。 このトピックの詳細については、以下を参照してください。

    "Microsoft Windows Dynamic Cache Service" をダウンロードして展開すると、システム キャッシュによって使用されるメモリを制御できます。

  • デバイス ドライバーに関連した問題:デバイス ドライバーで MmAllocateContiguousMemory 関数が使用され、HighestAcceptableAddress パラメーターの値が 4 ギガバイト (GB) 未満に設定されている場合、Windows オペレーティング システムによって、SQL Server プロセスを含む、システム上のプロセスのワーキング セットがページ アウトされることがあります。 この問題を解決するには、ドライバーの更新プログラムについて、デバイス ドライバーの製造元に問い合わせてください。

    デバイス ドライバーでメモリの割り当てが試行されると、Windows オペレーティング システムによって、他のアプリケーションのワーキング セットがページ アウトされることがあります。 この Windows 修正プログラムにより、イベント トレースを使用して、問題の原因となっているデバイス ドライバーを見つけることができます。 ワーキング セットのトリミング動作を引き起こす特定のドライバーの詳細については、「連続するメモリを割り当てるドライバーの識別」を参照してください。

  • オペレーティング システムに関連した問題:Windows オペレーティング システムによって SQL Server プロセスのワーキング セットがページ アウトされる原因となっている既知の問題を解決するには、次の Microsoft サポート技術情報の記事で説明されている修正プログラムを適用します。

    注意

    修正プログラムは累積されます。 新しいバージョンの修正プログラムには、以前のバージョンの修正プログラムが含まれています。

"Lock pages in memory" ユーザー権利を割り当てる前の重要な考慮事項

Lock pages in memory ユーザー権利を割り当てる前に、追加で考慮する必要があります。 正しく構成されていないシステムにこのユーザー権利を割り当てると、システムが不安定になったり、システム全体のパフォーマンスが低下したりする場合があります。 さらに、イベント ログにイベント ID 333 が記録される場合があります。

これらの問題について Microsoft カスタマー サポート サービス (CSS) に問い合わせると、CSS エンジニアが SQL Server サービスの開始アカウントとして使用されているユーザー アカウントに対して、このユーザー権利の取り消しを求めることがあります。 この手順は、SQL Server やシステムで実行されている他のアプリケーションに必要なさまざまなオプションの構成に CSS エンジニアが使用できる重要なパフォーマンス データを収集するために必要な場合があります。 CSS エンジニアがパフォーマンス データを収集した後に、Lock pages in memory ユーザー権利を SQL Server サービスの開始アカウントに割り当てることができます。

Lock pages in memory ユーザー権利を割り当てる前に、パフォーマンス モニターのログをキャプチャして、システムにインストールされているさまざまなアプリケーションやサービスのメモリ要件を確認してください。 これらのアプリケーションには、SQL Server も含まれます。 メモリ要件を特定するには、次のベースライン情報を収集します。

  • max server memory オプションと min server memory オプションが正しく設定されていることを確認してください。 これらのオプションには、SQL Server プロセスのバッファー プールのメモリ要件のみが反映されます。 これらのオプションには、SQL Server プロセス内の他のコンポーネント用に割り当てられたメモリは含まれません。 これらのコンポーネントには、次のものが含まれます。

    • SQL Server ワーカー スレッド
    • SQL Server によって SQL Server プロセスのアドレス空間の内部に読み込まれる各種 DLL やコンポーネント
    • バックアップ操作と復元操作
  • DLL およびコンポーネントには、さまざまな OLE DB プロバイダー、拡張ストアド プロシージャのほか、sp_OACreate ストアド プロシージャ、リンク サーバー、および CLR SQL Server で使用される Microsoft COM のオブジェクトが含まれます。 これらのコンポーネントに割り当てられるメモリは、SQL Server プロセスのアドレス空間の非バッファー プール領域に分類されます。 SQL Server プロセス全体で使用できる理想的なメモリの最大量を判断するには、バッファー プールを使用しないコンポーネントに割り当てられたメモリを、SQL Server プロセスで使用するメモリの合計から減算する必要があります。 その後、残りの値を使用して max server memory オプションを設定できます。 max server memory オプションと min server memory オプションを設定する前に、SQL Server オンライン ブックの「メモリ オプションの手動設定」のトピックをよく確認してください。

  • 他のアプリケーションと Windows オペレーティング システム コンポーネントのメモリ要件を決定します。 アプリケーションには、SQL Server エージェント、SQL Server レプリケーション エージェント、SQL Server Reporting Services、SQL Server Analysis Services、SQL Server Integration Services、SQL Server フル テキスト検索など、他の SQL Server コンポーネントが含まれている場合があります。 バックアップ操作とファイル コピー操作が実行されるアプリケーションでは、大量のメモリを使用する場合があります。 一括コピーなどの操作やファイル IO を生成するスナップショット エージェントが考えられます。 max server memory オプションと min server memory オプションの値を決定するときは、これらすべてのアプリケーションのメモリ要件を考慮する必要があります。 各プロセスの Process オブジェクトの下にある Private Bytes カウンターと Working Set カウンターを使用して、特定のプロセスのメモリ要件を決定できます。

  • 既定では、組み込みのローカル システム アカウントには、Lock pages in memory ユーザー権利が既に割り当てられています。 詳細については、次の Microsoft Web サイトを参照してください。ローカル システムで Lock pages in memory の権限を割り当てる必要がありますか

  • ドメイン内のすべての SQL Server プロセスで Windows ユーザー アカウントをグローバルに使用する場合は、グループ ポリシー構成を使用して割り当てられたユーザー権利を確認します。 32 ビットの SQL Server プロセスでは、このアカウントを開始アカウントとして使用できます。 ただし、このアカウントには、Address Windowing Extensions (AWE) 機能を有効にするための Lock pages in memory ユーザー権利が必要です。 詳細については、SQL Server オンライン ブックの「SQL Server に対する最大メモリ容量の指定」のトピックを参照してください。

  • max server memory オプションと min server memory オプションを複数の SQL Server インスタンスに対して構成する前に、SQL Server の各インスタンスに対する非バッファー プールのメモリ要件を考慮してください。 次に、SQL Server の各インスタンスに対してこれらのオプションを構成します。

このベースライン情報は、負荷がピークの間に収集するのが理想的です。 それによって、さまざまなアプリケーションおよびコンポーネントの、ピーク時の負荷に対応するメモリ要件を確認できます。 メモリ要件は、システム上で実行されているアクティビティやアプリケーションによって、システムごとに異なります。 動的管理ビュー sys.dm_os_process_memory で提供されている情報を照会して、そのシステムでメモリ不足の状態が発生しているかどうかを把握できます。 詳細については、「sys.dm_os_process_memory (Transact-SQL)」を参照してください。

Windows Server 2008 および R2 バージョンで追加された機能強化

Windows Server 2008 および Windows Server 2008 R2 では、連続するメモリ割り当てメカニズムが向上しています。 この機能強化により、Windows Server 2008 と Windows Server 2008 R2 では、新しいメモリ要求が到着したときに、アプリケーションによってワーキング セットがページ アウトされることによる影響を減らすことができます。

次に示すのは、Microsoft のホワイトペーパー「Windows でのメモリ管理の進歩」からの本機能強化に関する説明です。

Windows Server 2008 では、物理的に連続するメモリの割り当てが大幅に強化されています。 メモリ マネージャーはページを動的に置き換えるようになり、通常はワーキング セットをトリミングしたり、I/O 操作を実行したりしないため、連続したメモリを割り当てる要求は成功する可能性がはるかに高くなります。 さらに、カーネル スタックやファイル システム メタデータ ページなど、さらに多くの種類のページが置き換えの候補になりました。 そのため、より連続したメモリは、いつでも一般提供されます。 さらに、このような割り当てを取得するコストが大幅に削減されます。

詳細については、SQL Server のワーキング セットのトリミングにおける問題点に関するページを参照してください。

この記事で説明するサード パーティ製品は、Microsoft に関係のない企業によって製造されています。 Microsoft では、暗黙的またはそれ以外に関わらず、これらの製品のパフォーマンスや信頼性について何ら保証しません。