SQL Server 2008R2 Standard Editionがあり、16コアサーバー上のさまざまなアプリケーションに属するいくつかのデータベースがあります。
最近導入された1つのアプリケーションは、100%のCPU使用率につながる高価なクエリを定期的に実行しています。もちろん、他のアプリケーションがパフォーマンスの問題を報告しています。
リソースガバナーは、不正なアプリケーションに手綱を置くのに適したツールのようですが、残念ながら、Enterprise Editionでのみ利用できます。
他のアプリケーションはかなり単純なので、インスタンスの「最大並列度」を減らして1つのクエリでeverythingがダウンしないようにして、問題を抑制しようとしました。 CPUの負荷を50%に保つことに成功しましたが、驚くべきことに、他のアプリケーションの処理が滞るのを防ぐことはできませんでした。
ここで、新しいアプリケーションのデータベースを専用インスタンスに移動することを決定しましたが、このインスタンスに最適な構成は何でしょうか? MAXDOP設定を維持する必要がありますか、CPUアフィニティマスクを使用する必要がありますか、それとも、知らないCPU使用量を制限する別のオプションがありますか?
Windows Serverの機能であるWindowsシステムリソースマネージャー(WSRM)を使用できます(最小バージョンは不明ですが、2008 R2 +は間違いなくあります)。
これにより、プロセスで使用されるCPUの量を制御できるため、不正なアプリケーションを独自のSQL Serverインスタンスに分離していない場合は、とにかくそうする必要がありました。
processがWSRMで設定した最大制限を超えることはないため、この時点で任意のMAXDOP
を設定できます。
CPUアフィニティマスクの設定はオプションです。競合を排除するために、アプリケーションを独自のコアのセットに完全に分離する必要があります(注:NUMAノードに注意してください)。これらの追加のコアが利用可能な場合は、それを試してください。ただし、そのアプリケーションがアイドル状態のとき、all CPUを他のアプリケーションで使用できるため、WSRMソリューションをお勧めします。
MAXDOPをコアの半分に設定していて、他のクエリが依然として傍受されている場合は、メモリまたはディスクI/Oの競合に対処している可能性があります。 RAMはサーバーにどのくらいありますか、そしてアプリケーションデータベースはどれくらい大きいですか?
パフォーマンスに問題が発生した場合は、これらのperfmonカウンターを確認してください。サーバーがより多くのメモリまたはより高速なディスクサブシステムを必要とするかどうかを理解できます。
SQLServer:Buffer Manager
ページの読み取り数/秒が急増し、他の2つが大幅に減少する場合、問題のあるクエリはおそらくバッファープールを破壊し、大量のディスクI/Oを引き起こしています。次に、クエリの調整に取り組むか、より多くのハードウェアを投入します(RAMの増加、ディスクの高速化)。