5

我们遇到了一些奇怪的性能问题,我希望有人能指出我们正确的方向。我们的场景是一个ASP.NET MVC C#使用EF4 POCOin的网站IIS 7(高度规范的服务器,专用于此应用程序)。

显然它在 application_startup 上的速度很慢,这是意料之中的,但是一旦加载,您就可以浏览网站,一切都很好,页面加载速度快 0.5 毫秒(我们正在使用Mini-Profiler)。现在,如果您停止使用该网站 5 到 10 分钟(我们将应用程序池回收设置为 2 小时并且我们正在记录,所以我们知道它没有被回收)那么第一页加载速度非常慢,10 - 15 秒,但随后您可以再次导航而不会出现问题(0.5 毫秒)。

这并不是SQL queries很慢,因为所有查询在第一页命中后似乎都可以正常工作,即使它们尚未运行,因此也不会在任何地方缓存。

我们已经进行了大量的测试,我无法弄清楚这一点。到目前为止,我尝试过的主要事情是预生成 EF 视图,但这并没有帮助。

在 Sql Server Profiler 中没有任何活动并且没有站点交互的情况下查看 5 分钟后,似乎Sql Server Profiler需要或需要 30 秒后,应用程序会出现几个“审核注销”条目,一旦发生这种情况,它似乎需要 10 - 15秒刷新应用程序。是否有空闲超时Sql Server

4

8 回答 8

5

如果您在连接字符串中使用以下内容,这应该可以工作:

server=MyServer;database=MyDatabase;Min Pool Size=1;Max Pool Size=100

它将强制您的连接池始终保持至少一个连接。我必须说我不推荐这个(持久连接),但它会解决你的问题。

于 2012-06-20T14:29:24.667 回答
2

你在使用 LMHOSTS 文件吗?我们有同样的问题。LMHOSTS 文件缓存默认在 10 分钟后过期。系统空闲 10 分钟后,主机将在重新加载 LMHOSTS 文件之前使用广播消息,从而导致延迟。

于 2012-10-01T21:45:45.600 回答
1

似乎在 5 分钟后查看 Sql Server Profiler 给予或花费 30 秒,而 Sql Server Profiler 中没有任何活动并且没有站点交互,应用程序出现几个“审核注销”条目,一旦发生,它似乎需要10 - 15 秒刷新应用程序。Sql Server 上是否存在空闲超时?

这告诉我问题很可能在于您的 SQL 服务器和/或与它的连接,而不是您的应用程序。SQL 服务器使用连接池,SQL 会不时清理这些池并清理它们。您似乎遇到的延迟是您的连接池已被清理(审核注销)并且您必须建立新连接。我会与您的 SQL 数据库人员交谈/工作。

对于测试,您是否有权访问与生产应用程序不在同一 SQL 服务器上运行的数据库的本地/开发副本?如果没有,请尝试进行一项设置,看看您是否遇到同样的问题。

于 2012-06-18T18:44:45.917 回答
0

由于它是第一次运行(每个应用程序?)速度很慢,您可能会遇到将 EDMX 或 LINQ 编译为 SQL 的过程。

可能的解决方案:

  1. 使用预编译视图和预编译查询(可能需要大量重构)。
    http://msdn.microsoft.com/en-us/library/bb896240.aspx
    http://blogs.msdn.com/b/dmcat/archive/2010/04/21/isolating-performance-with-precompiled-pre -generated-views-in-the-entity-framework-4.aspx
    http://msdn.microsoft.com/en-us/library/bb896297.aspx
    http://msdn.microsoft.com/en-us/magazine /ee336024.aspx

  2. 在应用启动时试运行所有查询(在收到第一个请求之前)。
    您可以在默认连接字符串(可以是空数据库)上使用假输入(例如不存在的零键)运行查询。只要确保不抛出异常(使用 SingleOrDefault() 而不是 Single() 并在 .ToList() 上处理空结果和 0 长度列表结果)。

于 2012-06-17T13:18:19.943 回答
0

我将对 SQL Server 运行“SQL Server Profiler”并捕获新的跟踪,同时通过在空闲 5-10 分钟后访问该站点来重现问题。之后查看痕迹。具体来说,查找 ApplicationName 以“EntityFramework...”开头的条目。这将告诉您当时 EF 在做什么。EF 之上的自定义缓存可能存在一些问题,或者某些会话状态即将到期(检查 web.config 中的 sessionState 超时)

于 2012-05-22T13:17:00.407 回答
0

创建一个简单的网页,该网页使用诸如“Select getDate()”之类的简单查询或其他一些廉价查询来访问 SQL Server。然后使用 Pingdom 或其他监视器等外部服务每隔 30 秒左右访问该页面。这应该保持连接温暖。

于 2012-06-19T02:43:08.800 回答
0

尝试在 web.config 中覆盖您的超时,如下例所示:

Data Source=mydatabase;Initial Catalog=Match;Persist Security Info=True
;User ID=User;Password=password;Connection Timeout=120

如果它有效,这不是一个解决方案..只是一个解决方法。

于 2012-06-20T01:45:00.220 回答
0

在我们的案例中,应用程序托管在 Azure 应用服务计划中,并且遇到了类似的问题。原来是没有配置虚拟网络的问题。请参阅此处的问题/答案 - EF Core 3.1.14 Recurring Cold Start

于 2021-05-08T08:27:53.013 回答