我们正在针对SQL Azure运行多个Azure Web应用程序(.NET Core,MVC4,MVC5)。每隔10秒,SQL Server的响应就会有相当大的延迟。我们已经使用控制台应用程序对相同的查询进行了100次循环测试,并且无论何时启动控制台应用程序,延迟都会每10秒发生一次。
查询通常需要150毫秒才能完成。每10秒将需要2-3秒。
在测试和生产数据库服务器上,行为是相同的。我们使用了一些触发器(5),这些触发器都不是由负载测试中使用的查询触发的。
负载测试是具有简单选择查询的存储过程。在运行这些测试时,没有其他用户在使用我们的测试环境。
我们还使用Azure门户中的性能测试工具对此进行了负载测试,结果相同。
关于从哪里开始寻找造成这种延迟的根本原因的任何想法?
我们的测试代码:
private static void Main(string[] args)
{
var ss = new Stopwatch();
// Let's go
using (SqlConnection connection = new SqlConnection(connectionString))
{
for (var i = 0; i < 100; i++)
{
ss.Restart();
connection.Open();
var sql = "EXEC usp_loadTestSp";
using (SqlCommand command = new SqlCommand(sql, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
Console.WriteLine($"Current time {i}: {DateTime.UtcNow}");
}
}
connection.Close();
Console.WriteLine($"Loop time {i}: {ss.ElapsedMilliseconds}");
}
}
EndApp();
}
更新:
刚刚在Azure上使用新的空白SQL数据库创建了一个新的SQL Server。没有桌子,什么都没有。在测试应用程序中更新了连接字符串,将查询更改为SELECT NULL
。结果相同,每10秒需要花费更长的时间...
答案 0 :(得分:2)
非常感谢您的答复,对于延迟的答复,我们深表歉意。
我已找到导致此问题的原因,并且与SQL Azure或任何其他Azure服务无关。
问题出在我的设备上,是问题所在,而罪魁祸首是我用来将文档同步到Google云端硬盘的Google云端硬盘流客户端。使用“ ping -t”进行测试,每10秒会有2秒的非常稳定的延迟。停用Google云端硬盘流后,ping一直都是快速的。重新启用Google云端硬盘流,延迟又回来了。
现在开始找出如何继续使用文件流而没有延迟。
TGM
答案 1 :(得分:1)
没有特定原因说明SQL Azure通常会以这种方式表现。但是,当您遇到这种情况时,建议您先将客户端逻辑和客户端驱动程序/网络与服务器上发生的逻辑分开。因此,在这种情况下,您可以创建一个存储过程,该存储过程的作用等同于程序中的循环,并尝试在服务器上运行该循环并计时。它应该为您提供一些数据,而无需涉及其他部分。
您的另一个选择是查看查询存储(这将为您提供服务器上查询执行时间的摘要数据,而不是跟踪级数据,但是它为您提供了min / max / last / avg / stdev每个指标)。这应该为您提供另一个数据点,以评估它是来自服务器端还是来自客户端/应用程序端。 https://docs.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-2017
另一种选择是启用用于执行查询的设置“统计时间开启”-这将为您提供一组额外的数据,您可以在客户端驱动程序中检索有关服务器用于处理查询的资源的数量。
造成此问题的一个可能原因是服务器上的数据是否有偏差-换句话说,如果表中的10s比其他值多得多。在这种情况下,您将不得不检索更多的值,这可能会在查询响应时间中引入差异。
最后,您可以使用XEvents跟踪每个查询的执行时间(尽管当前需要在SQL Azure上进行一些设置,但是可以将查询的事件跟踪转储到Blob存储中,因此您可以可以查看服务器认为使用了多少时间。)
我希望这能给您带来一些尝试来追踪您的神秘感。