什么是SNIReadSyncOverAsync,为什么它需要很长时间才能完成?

30
在我们的ASP.Net网站上,一些请求超时了。AppDynamics显示SQL存储过程调用只需要几秒钟就能返回结果,但是我们花费了100多秒在SNIReadSyncOverAsync上。有人知道这个方法是做什么的,为什么会花费那么长时间吗?我们没有使用EF,这在我能找到的每个问题/帖子中都被引用。谢谢提前。
更新
已经过了一段时间,虽然我们从未解决为什么所有时间都花在SNIReadSyncOverAsync上的问题,但我有几个想法。我认为在这种情况下,可能是特定版本的AppDynamics报告了在SQL调用上所花费的时间方式,但我没有真实的数据来支持我的猜测,只是根据我观察到的情况。我们最终停止看到花费在SNIReadSyncOverAsync上的时间,并且它转移到了查询本身超时。即使在同一个数据库中,相同的查询也可以在SSMS中立即运行,这仍然不太合理。
最终答案与ARITHABORT有关,导致我们的应用程序和SSMS使用了两个不同的执行计划(参见 https://dba.stackexchange.com/a/9841),这就解释了为什么我们无法在SSMS中重现超时问题。
解决了该问题后,我们能够确定该过程的一些部分需要进行调优,自此以后,我们没有再遇到未经说明的超时或SNIReadSyncOverAsync。

很不幸,我们无法解决这个问题。更奇怪的是,AppDynamics的新版本不再在SNIReadSyncOverAsync方法上显示该问题,而是在DbDataAdapter.Fill上显示。 - ryan.rousseau
3个回答

16

不确定您是否已经解决了这个问题,但是:SNI是SQL Server Network Interface,而且在大多数等待从SQL Server获取数据的ADO.NET完整调用堆栈中都存在所提到的方法。这与高层实现是EF、原始ADO.NET还是其他任何内容无关。

我不确定AppDynamics使用哪种度量或信号来捕获存储过程执行的完成情况,但是如果您的存储过程完成相对较快,但将查询结果从服务器传输到客户端需要一段时间,则可能会看到这种行为。

如果不了解更多有关基础架构的信息,则很难进一步帮助。如果问题仍然存在,我建议在SQL Server Management Studio中运行相同的查询,并将 "SET STATISTICS TIME ON"和 "Include Client Statistics" 切换打开。也许这些数字可以让您了解数据传输是否真的是问题所在。


1
我已经向微软提交了一个支持案例,但目前还没有强有力的线索。如果我得到答案,我会更新的。感谢您提供 SET STATISTICS 的提示。 - ryan.rousseau

1
在我的情况下,正如Jouni所提到的那样,查询结果传输非常缓慢。我使用Automapper来准备发送给客户端的数据。因此,不清楚是哪个属性导致了负载,但为了确保,我已经删除了所有我不需要在客户端显示的复合属性。(最初我需要在客户端网格中显示一个集合。)执行变得非常快。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接