在我们的ASP.Net网站上,我们有一些请求超时。 AppDynamics显示sql过程调用在几秒钟内返回,但是我们在SNIReadSyncOverAsync中花费了100秒。
有谁知道这个方法是/做什么,为什么要花这么多时间?我们没有使用在我能够找到的每个问题/帖子中引用的EF。
提前致谢
更新
这是一段时间,虽然我们从来没有提到过为什么所有的时间都花在SNIReadSyncOverAsync上,但我有一些想法。
我认为在这种情况下,这可能是AppDynamics的特定版本报告了sql调用所花费的时间的方式,但是我没有真正的数据来支持,只是我从我观察到的猜测。我们最终停止看到报告的时间在SNIReadSyncOverAsync中花费的时间,并将其转移到查询本身超时。
因为相同的查询可以在同一个数据库上的SSMS中立即运行,所以仍然没有太大的影响。
最终的答案最终与ARITHABORT有关,导致我们的应用程序和SSMS使用两种不同的执行计划(见https://dba.stackexchange.com/a/9841),解释为什么我们无法使用SSMS再现超时。
一旦我们解决了这个问题,我们就可以确定需要进行调整的程序的几个部分,而且我们还没有遇到无法解释的超时或SNIReadSyncOverAsync。
解决方法
不确定您是否已经解决了这个问题,但是:SNI是sql Server网络接口,并且大多数ADO.NET完全调用堆栈中存在所提到的方法,它们等待sql Server的数据。这是不管高级别的实现是EF,原始的ADO.NET还是其他的。
我不知道AppDynamics使用哪个度量或信号来捕获存储过程执行的完成,但如果您的存储过程完成相对较快,但是将查询结果从服务器传输到客户端,则可能会看到此类行为一会儿。
在不了解更多关于您的基础设施的情况下,很难进一步帮助。如果问题仍然存在,建议您在sql Server Management Studio中运行相同的查询,并将SET STATISTICS TIME ON和“包括客户端统计信息”切换到开启状态。也许这些数字会让您了解数据传输是否真的是问题。