- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在对使用 EF (System.Data.Entities)
从 SQL DB 读取的 WCF 服务进行一些分析。当我启动多个访问服务的并行客户端时,CPU 都达到 100%,性能通常下降,一切都陷入困境。
在使用并发分析器对此进行分析时,我发现 85% 的时间花在同步上,只有大约 4% 用于实际代码执行。深入查看堆栈跟踪,大部分同步似乎来自 System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync
中对 WaitForSingleObject
的调用。堆栈显示调用转到 native 方法包装器,然后在 kernel32.dll!_WaitForSingleObject
结束。
有没有人遇到过这种情况?有什么办法可以解决这个问题吗?我并没有真正为此施加荒谬的负载,只有大约 20 个并行客户端,而且都是只读的,所以我很惊讶线程甚至会费心同步。
我已经和这个问题抗争了一个星期了,我就是无法解释它。任何帮助将不胜感激!
最佳答案
您能否将其提炼成可重现问题的小代码示例?您使用的是什么版本的 EF?
以下是根据您目前提供的信息得出的一些观察结果。
任何小于 EF 6 的东西都是总是同步的。对于 EF 6,您可以选择使用 async methods instead .但是,除非您的 WCF 服务也使用异步模式,否则不要这样做。
您可以编写异步实现的 WCF 服务。参见 this documentation获取更多信息。
如果您使用上述方法中的一个,而不是同时使用这两种方法,您的代码将不是异步的,但会产生不必要的同步开销。尤其要避免 Task.Run()
或等价物,因为它们只会将工作转移到另一个线程,而不会实际提高吞吐量。
最后,另一个无关的想法。您的问题可能与 EF 初始化有关吗?当 EF 为模型构建元数据时,它会为每个连接字符串执行一次。如果多个线程尝试使用同一个模型,而该模型尚未初始化,则所有线程都将阻塞,直到初始化完成。要查看这是否是您的问题,请调用该服务并让它完成。然后提交您的 20 个并行请求。他们是否仍会占用 CPU 资源?
关于c# - SNIReadSyncOverAsync 和 WaitForSingleObject 阻塞 EF 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12654002/
在我们的 ASP.Net 网站上,我们遇到了一些请求超时的情况。 AppDynamics 显示 SQL 过程调用在几秒钟内返回,但我们在 SNIReadSyncOverAsync 中花费了 100 多
我正在对使用 EF (System.Data.Entities) 从 SQL DB 读取的 WCF 服务进行一些分析。当我启动多个访问服务的并行客户端时,CPU 都达到 100%,性能通常下降,一切都
我是一名优秀的程序员,十分优秀!