次の方法で共有


MSSQLSERVER_17890

適用対象: SQL サーバー

詳細

属性 Value
製品名 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 サービスのスタートアップ アカウントとして使用されるユーザー アカウントに[メモリ内のページをロックする]ユーザー権限を割り当てます。 ただし、このソリューションを実装する前に、SQL Server のインスタンスに対して "Lock pages in memory" ユーザー権利を割り当てる前に、「SQL Server メモリがページ アウトされる原因」と重要な考慮事項に関するセクションを見直してください。

Note

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

SQL Server 2008 SP1 Cumulative Update 2 以降では、SQL Server Standard エディションと Enterprise エディションの両方で、メモリ 内のロック ページを使用できます。 ロックされたページのサポートの詳細については、「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 サービスを再起動します。

メモリ内のロック ページをユーザーに割り当てて SQL Server サービスを再起動すると、Windows オペレーティング システムは SQL Server プロセス内のバッファー プール メモリをページアウトしなくなります。 ただし、Windows オペレーティング システムでは、SQL Server プロセス内でバッファー以外のプール メモリをページングできます。

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

このメッセージは SQL Server にのみ適用されます。 ERRORLOG のこのメッセージの詳細については、次を参照してください。 ローカル システムのメモリのロック ページの権限を割り当てる必要がありますか。

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

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

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

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

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

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

    • パフォーマンス オブジェクト: プロセス
    • カウンター: ワーキング セット

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

    • パフォーマンス オブジェクト: メモリ
    • カウンター: 使用可能なメモリ (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 プロセスのワーキング セットをページングする原因となる既知の問題を解決するには、次のマイクロソフト サポート技術情報の記事に記載されている修正プログラムを適用します。

    Note

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

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

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

これらの問題について Microsoft カスタマー サポート サービス (CSS) に問い合わせる場合、CSS エンジニアは、SQL Server サービスのスタートアップ アカウントとして使用されるユーザー アカウントに対して、このユーザー権限を取り消すように求められる場合があります。 この手順は、CSS エンジニアが SQL Server やシステム上で実行されている他のアプリケーションのさまざまなオプションの必要な構成に使用できる重要なパフォーマンス データを収集するために必要な場合があります。 CSS エンジニアがパフォーマンス データを収集したら、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 ストアド プロシージャ、リンク サーバー、および SQL Server CLR に使用される Microsoft COM オブジェクトが含まれます。 これらのコンポーネントに割り当てられるメモリは、SQL Server プロセスのアドレス空間のバッファー以外のプール領域に含まれます。 SQL Server プロセス全体で使用できるメモリの最大量を判断するには、バッファー プールを使用しないコンポーネントに割り当てられているメモリを、SQL Server プロセスで使用する合計メモリから減算する必要があります。 その後、残りの値を使用して max server memory オプションを設定できます。 最大サーバー メモリ オプションと最小サーバー メモリ オプションを設定する前に、SQL Server オンライン ブックの「メモリ オプションを手動で設定する」トピックを慎重に確認する必要があります。

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

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

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

  • 複数の 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 のワーキング セットのトリミングにおける問題点に関するページを参照してください。

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。