cpuの使用率が上昇し、サイトが停止して再起動されるまでSQL Serverが100%のままであるという問題が発生しています。私たちはコードを実行し、可能な限りすべてを最適化しましたが、これはまだ起こっています。SqlCacheDependencyに起因するSQL ServerのCPU使用率が高くなる
キャッシュとは、SQL Serverから構造全体(〜6000行)をロードし、キャッシュに格納し、そのキャッシュをクエリして残りの部分で実行する必要のあるクエリを実行するものです。アプリケーションでは(データに対して実行する必要のある再帰的操作が多数あり、それ以外の場合はSQL Serverにとって大きなヒットとなります)。
これは、sqlキャッシュの依存関係を使用すると、SQL Server上でCPUスパイクが発生するように思われるためです。無効にすると、同じ量のデータをキャッシュしているにもかかわらず、スパイク(SQLサーバーまたはWebサーバー上)に遭遇することはなくなりました。
誰かがsqlキャッシュの依存関係についてこのような動作を引き起こす可能性がありますか? 使用されるSQL ServerはSQL Server 2008 R2です。 WebサーバーはIIS 7.5で、ASP.NET 3.5を使用しました。このWebサーバーはクラスタ(x2)としてセットアップされ、両方が同じSQL Serverを指しています。
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
{
cn.Open();
string query =
@"SELECT
id,
parentid,
field1,
field2,
field3,
field4,
field5
FROM
dbo.theTableWithDataInIt";
SqlCommand cmd = new SqlCommand(query, cn);
cmd.Notification = null;
cmd.NotificationAutoEnlist = true;
SqlCacheDependencyAdmin.EnableNotifications(
ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(
ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)
.Contains("dbo.theTableWithDataInIt"))
{
SqlCacheDependencyAdmin.EnableTableForNotifications(
ConfigurationManager.ConnectionStrings["MyConnectionString"].
ConnectionString, "dbo.theTableWithDataInIt");
}
SqlCacheDependency dependency = new SqlCacheDependency(cmd);
cmd.ExecuteNonQuery();
//
// Get Cache Data is a function that returns a DataSet with the data to be added to cache
//
Cache.Insert("mycache", GetCacheData(), dependency);
}
"theTableWithDataInIt"テーブルが更新されていますか? SQLプロファイラトレースを実行して、クエリアクティビティが何であるかを判断しましたか? –
データを更新できる管理部分がアプリケーションにあります。しかし、これは支配下に置くためにサイトをダウンさせる必要がある持続的なCPUスパイクを引き起こすほど十分に起こらないはずです。私たちはプロファイラを調べましたが、これは普通のことではありませんでした。 – computrius
私たちはしましたが、犯人であるとは考えられませんでした。また、そのような場合は、SQL依存関係をオフにしても起こります。 – computrius