Asp.net Windows 8.1/IIS 8.5.9600.16384上的信号器和SQLDependency性能问题
我刚刚开始开发一个POC,用于实现Signalr2+SQL依赖关系,以控制实时仪表板(尽管我正在开发的POC与项目要求略有不同) 此POC测量每个逻辑核心的服务器CPU使用率 POC测试页面预览 我已经成功地实现了依赖项预览,我可以在测试html页面上看到实时预览,在本地SQL DB中进行任何更改的那一刻 这些更改由独立的命令行应用程序通过简单的更新查询进行更新。我的数据库也有一个4列的简单单行结构(至少目前是这样) 问题是,通过“dependency_OnChange”事件触发20-30次更改后,CPU使用率会下降95-100%(即使只有Visual Studio和单个浏览器处于打开状态,并且命令行应用程序正在运行以进行更新) 后震波预览 我正在Windows 8.1和IIS 8.5中使用Visual Studio(2015社区版)。POC页作为“”运行,尚未托管在IIS中 我尝试了这里描述的解决方案: 同时也在寻找解决方案: 我还不知道,还没有什么新奇的东西(如果性能很好,将在Asp.NETMVC下实现),但即使是最简单的愚蠢的东西也不会带来好运 Global.asax的代码Asp.net Windows 8.1/IIS 8.5.9600.16384上的信号器和SQLDependency性能问题,asp.net,signalr,real-time,signalr-hub,sqldependency,Asp.net,Signalr,Real Time,Signalr Hub,Sqldependency,我刚刚开始开发一个POC,用于实现Signalr2+SQL依赖关系,以控制实时仪表板(尽管我正在开发的POC与项目要求略有不同) 此POC测量每个逻辑核心的服务器CPU使用率 POC测试页面预览 我已经成功地实现了依赖项预览,我可以在测试html页面上看到实时预览,在本地SQL DB中进行任何更改的那一刻 这些更改由独立的命令行应用程序通过简单的更新查询进行更新。我的数据库也有一个4列的简单单行结构(至少目前是这样) 问题是,通过“dependency_OnChange”事件触发20-30次
protected void Application_Start(object sender, EventArgs e)
{
SqlDependency.Start(connString);
}
protected void Application_End(object sender, EventArgs e)
{
SqlDependency.Stop(connString);
}
Startup.cs的代码
public class Startup
{
public void Configuration(IAppBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
app.MapSignalR();
}
}
集线器类的代码
public class AppHub : Hub
{
private static string conString = ConfigurationManager.ConnectionStrings["DBConn"].ToString();
[HubMethodName("sendMessages")]
public static void SendMessages()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<AppHub>();
context.Clients.All.updateMessages();
}
}
SQL依赖项的代码
public class CPUUsage
{
public string Core1Usage { get; set; }
public string Core2Usage { get; set; }
public string Core3Usage { get; set; }
public string Core4Usage { get; set; }
}
public class CPUUsageHistory
{
readonly string _connString = ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString;
public IEnumerable<CPUUsage> GetAllMessages()
{
var cpuusage = new List<CPUUsage>();
using (var connection = new SqlConnection(_connString))
{
connection.Open();
using (var command = new SqlCommand(@"SELECT [Core1Usage],[Core2Usage],[Core3Usage],[Core4Usage] FROM [dbo].[CpuUsageDetails]", connection))
{
command.Notification = null;
var dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
var reader = command.ExecuteReader();
while (reader.Read())
{
cpuusage.Add(item: new CPUUsage
{
Core1Usage = reader["Core1Usage"].ToString(),
Core2Usage = reader["Core2Usage"].ToString(),
Core3Usage = reader["Core3Usage"].ToString(),
Core4Usage = reader["Core4Usage"].ToString()
});
}
}
}
return cpuusage;
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
AppHub.SendMessages();
}
}
}
}
公共类CPUUsage
{
公共字符串Core1Usage{get;set;}
公共字符串Core2Usage{get;set;}
公共字符串Core3Usage{get;set;}
公共字符串Core4Usage{get;set;}
}
公共类CPUU历史
{
只读字符串_connString=ConfigurationManager.ConnectionString[“DBConn”].ConnectionString;
公共IEnumerable GetAllMessages()
{
var cpuusage=新列表();
使用(var连接=新的SqlConnection(_connString))
{
connection.Open();
使用(var命令=新的SqlCommand(@“从[dbo].[CpuUsageDetails]”中选择[Core1Usage]、[Core2Usage]、[Core3Usage]、[Core4Usage]”,连接))
{
command.Notification=null;
var-dependency=newsqldependency(命令);
dependency.OnChange+=新的OnChangeEventHandler(dependency\u OnChange);
if(connection.State==ConnectionState.Closed)
connection.Open();
var reader=command.ExecuteReader();
while(reader.Read())
{
添加(项目:新cpuusage
{
Core1Usage=读卡器[“Core1Usage”]。ToString(),
Core2Usage=读卡器[“Core2Usage”]。ToString(),
Core3Usage=读卡器[“Core3Usage”]。ToString(),
Core4Usage=reader[“Core4Usage”].ToString()
});
}
}
}
返回cpuusage;
}
private void dependency_OnChange(对象发送方,SqlNotificationEventArgs e)
{
if(e.Type==SqlNotificationType.Change)
{
AppHub.SendMessages();
}
}
}
}
我错过了什么/做错了什么?你能做的事情很少
有2-3个浏览器实例(主要是Chrome48)。。。如果与.1一起使用,系统阻塞和Firefox45b崩溃。我确实勾选了那个选项。2.我将很快检查集线器更新选项。
public class AppData : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/json";
CPUUsageHistory _messageRepository = new CPUUsageHistory();
context.Response.Write(
JsonConvert.SerializeObject(_messageRepository.GetAllMessages()));
}
public bool IsReusable
{
get
{
return true;
}
}
}
public class CPUUsage
{
public string Core1Usage { get; set; }
public string Core2Usage { get; set; }
public string Core3Usage { get; set; }
public string Core4Usage { get; set; }
}
public class CPUUsageHistory
{
readonly string _connString = ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString;
public IEnumerable<CPUUsage> GetAllMessages()
{
var cpuusage = new List<CPUUsage>();
using (var connection = new SqlConnection(_connString))
{
connection.Open();
using (var command = new SqlCommand(@"SELECT [Core1Usage],[Core2Usage],[Core3Usage],[Core4Usage] FROM [dbo].[CpuUsageDetails]", connection))
{
command.Notification = null;
var dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
var reader = command.ExecuteReader();
while (reader.Read())
{
cpuusage.Add(item: new CPUUsage
{
Core1Usage = reader["Core1Usage"].ToString(),
Core2Usage = reader["Core2Usage"].ToString(),
Core3Usage = reader["Core3Usage"].ToString(),
Core4Usage = reader["Core4Usage"].ToString()
});
}
}
}
return cpuusage;
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
AppHub.SendMessages();
}
}
}
}