none
SQL Server 2016のインスタンスの最大サーバーメモリについて RRS feed

  • 質問

  • こんにちは。

    インスタンスを追加後、最大サーバーメモリサイズに最小値の128MBを指定すると

    サーバーのスペックに関係なく、必ずsqlsvr.exeプロセスのCPU使用率があがってしまうという

    現象が発生しています。

    なぜ、128MBを指定した場合にCPUに負荷がかかるのか原因と対処(メモリを増やすとか、128MB以外にするとかではなく)を

    ご存知の方がいらっしゃいましたらご教示ください。

    よろしくお願いいたします。

    2019年7月1日 9:59

すべての返信

  • 単純にメモリが足りなくて、オンメモリの作業領域が足りない分、I/O処理が増えてCPU負荷が上がっているだけでしょう。おそらく、I/O待ちでデッドロックして余計に負荷が上がっている可能性が高い。クエリーの処理内容や処理するデータの量に合わせて適切な量のオンメモリの作業領域を確保することが必要です

    2019年7月1日 15:12
  • 興味がありましたので調べてみましたが、私の環境でも 128MB にすることで、CPU 使用率が上昇するという現象は確認できました。

    こちら、128MB にすることで、システムタスクが実行されるリソースプール (internal) で必要なメモリが確保できず、

    • バックグラウンドタスクを起動
    • メモリが確保できずタスクを起動できない

    という状態が繰り返されて、CPU 負荷が上昇しているのかと思います。

    SQL Server のログファイルである、ERRORLOG ファイルを確認すると、次のような内容が出力されています。

    2019-07-02 10:51:58.35 Server      エラー: 17300、重大度: 16、状態: 1。
    2019-07-02 10:51:58.35 Server      SQL Server was unable to run a new system task, either because there is insufficient memory or the number of configured sessions exceeds the maximum allowed in the server. Verify that the server has adequate memory. Use sp_configure with option 'user connections' to check the maximum number of user connections allowed. Use sys.dm_exec_sessions to check the current number of sessions, including user processes.
    2019-07-02 10:51:58.36 spid66s     Error: 701, Severity: 17, State: 123.
    2019-07-02 10:51:58.36 spid66s     There is insufficient system memory in resource pool 'internal' to run this query.
    2019-07-02 10:52:16.50 Server       Failed allocate pages: FAIL_PAGE_ALLOCATION 1
    2019-07-02 10:52:16.50 Server      

    internal のリソースプールはシステムのバックグラウンドタスクが実行される際に使用されるプールのはずですが、このプールのメモリが使用可能なメモリが max server memory によって制限されてしまっているため、確保ができず、システムタスクの再実行が繰り返されているのかと。

    メモリサイズを変更し、CPU の使用状況が高い状態のスレッドの状態も見てみましたが、クエリ実行のループを繰り返しているのではと思います。

    システムタスクを実行するために必要となるメモリが確保できていない状況のように思えますので、メモリを変更するという設定以外の解決策をご希望とのことですが、設定を変更する以外の方法での解決は厳しいのではないでしょうか。

    2019年7月2日 2:04
    モデレータ