【问题标题】:Local ASP.NET MVC Suddenly Very Slow; Load times > 1 minute本地 ASP.NET MVC 突然很慢;加载时间 > 1 分钟
【发布时间】:2011-03-09 05:01:30
【问题描述】:

在过去的几周里,当我浏览本地托管的 ASP.NET 3.5 MVC Web 应用程序 (C#) 时,我的性能突然显着下降。给定页面的加载时间平均为 20 秒(无论内容如何);启动通常超过一分钟。这些应用程序在生产甚至测试系统上运行速度很快(测试系统与我的开发环境相当)。

我正在运行 IIS 6.0、VS2008、Vista Ultimate、SQL2005、.NET 3.5、MVC 1.0,我们使用 VisualSVN 1.7。

我的 SQL 数据库是本地的,IPv6 似乎不是原因。我在调试模式之外使用环回、机器名和“本地主机”在 Firefox 和 IE8 中浏览,每次都得到完全相同的结果(因此 DNS 似乎也不是问题)。

以下是我的 dotTrace 输出的屏幕截图。

http://www.glowfoto.com/static_image/28-100108L/3123/jpg/06/2010/img4/glowfoto

此问题导致几乎无法调试/测试任何网络应用。非常感谢任何建议!

解决方案:完全重新安装 Windows、IIS、Visual Studio 等。这不是首选的解决方案,但它有效。

【问题讨论】:

  • 这是另一个 dotTrace 分析的屏幕截图:glowfoto.com/static_image/28-080245L/5997/jpg/06/2010/img5/…
  • 乍一看,这似乎是 I/O 问题(硬盘驱动器)。
  • Ug...您肯定需要考虑使用不同的图像托管平台。我推荐 imgur.com。
  • @Chuck Conway:我同意 I/O 问题,但是...... Alan,您的 web 应用程序使用的共享上是否托管了文件?
  • 这个 webapp 使用的所有东西都在我的开发机器上本地托管。再次感谢cmets!我目前正在尝试大卫的建议。欢迎提出其他建议!

标签: c# asp.net-mvc visual-studio-2008 sql-server-2005 iis-6


【解决方案1】:

该分析器输出中的大红旗肯定是 AddDirectory 被调用 408 次而 AddExistingFile 被调用 66,914 次这一事实?

您能否确认 MVC 应用程序的根文件夹下不仅有大量目录和文件?因为看起来框架正忙于自己尝试确定在启动时需要构建(或添加监视)哪些文件。

[我不熟悉 MVC,所以也许这不是正在发生的事情,但是 67k 调用一个名为“AddExistingFile”的函数确实有问题]。

【讨论】:

  • 解决方案的根目录下实际上有53308个文件和1684个文件夹。针对具体项目 27029 个文件和 445 个文件夹。在使用有问题的项目时,我一直在卸载解决方案中的所有其他项目,但是它们的运行速度都一样慢。
  • 我认为是时候考虑拆分项目了。将类分组为逻辑单元并将它们重构为单独的类库。请记住,即使您只更改项目中的一个文件,也必须重新编译每个文件。如果您拆分项目,则只有项目中更改的文件将被重建。当我这样做时,我有一个解决方案的典型构建时间从超过一分钟的构建时间到 2 秒。另外,如果您有任何 DBML,由于它们的大小,我总是将它们放在他们自己的项目中。
  • @Ryan 不幸的是,我不想把他们分开;我只是一个初级开发人员。但是,我使用“卸载项目”(Visual Studio 2008) 获得了相同的结果,我可以使用它来从构建中排除不相关的项目。
  • @alan 您可以通过定义自己的构建配置来获得相同的结果。它们位于 Build > Configuration Manager 菜单中。
【解决方案2】:

我了解到,当事情在 2 的幂次方附近发生故障时,它通常是一种“气味”......

给定

在过去的几周里,我的性能突然显着下降

AddExistingFile 被调用了 66,914 次

我想知道在文件数量超过 65,535 个时是否会出现性能不佳...

考虑的其他可能性...

  • 所有 66,914 个文件都在同一个目录中吗?如果是这样,那就有很多目录块要访问……试试硬盘碎片整理。事实上,如果它们分布在一堆目录中,那就是更多的目录块。

  • 您是否将所有文件存储在同一个列表中?您是在预设该列表的容量,还是让它自然而缓慢地“增长”?

  • 您是在扫描文件深度优先还是广度优先?操作系统缓存将优先考虑深度性能。

14/7 更新

澄清您是否将所有文件存储在同一个列表中?

像第一个示例这样的幼稚代码表现不佳,因为它需要随着列表的增长重新分配存储空间。

var myList = new List<int>();
for (int i=0; i<10000; i++)
{
    myList.Add(i);
}

如果您知道的话,使用特定容量初始化列表以避免重新分配开销会更有效:

var myList = new List<int>(10000);  // Capacity is 10000
for (int i=0; i<10000; i++)
{
    myList.Add(i);
}

15/7 更新

OP 评论:

这些网络应用程序不是以编程方式探测我硬盘上的文件,至少不是我的手。如果有任何递归文件扫描,它的VS 2008。

进行文件扫描的不是 Visual Studio - 是您的 Web 应用程序。这可以在您发布的第一个分析器跟踪中清楚地看到 - 对 System.Web.Hosting.HostingEnvironment.Initialize() 的调用需要 49 秒,主要是因为对 AddExistingFile() 的调用有 66,914 次。特别是,CreationTimeUTC 属性的读取几乎占用了所有时间。

这种扫描不是随机的——它要么是您配置应用程序的结果,要么是您的网络应用程序文件树中的文件。找到这些文件,您就会知道性能问题的原因。

【讨论】:

  • +1 如果您在加载页面时需要多次访问目录中的每个文件,则可能是系统设计方式存在问题。当文件数量增加时,他也会在生产中遇到这个问题。
  • @Bevan 你能推荐一个高质量的碎片整理程序吗?我使用了默认的 windows 之一无济于事。你是什​​么意思“将所有文件存储在同一个列表中”?这些网络应用程序不是以编程方式探测我硬盘上的文件,至少不是我的手。如果有任何递归文件扫描,它的VS 2008。
  • @Shiraz 我有一个类似的测试环境和二次开发环境,都没有遇到这个问题。
  • 我使用了MyDefrag,性能没有提升。关于如何找到这些 69k + 呼叫来自何处的任何建议?我很困惑,它一定是最近添加的一些程序集。但是我无法确定它可能是哪个组件。
  • Process Monitor 来自 SysInternals 将向您显示文件系统活动,应该为您指明正确的方向。
【解决方案3】:

尝试在新的 Web 文件夹中创建一个新的默认 MVC2 应用程序。构建并浏览它。如果新应用程序的加载时间没问题,那么您的应用程序就有问题。如果不是,则它超出了应用程序的上下文,您应该开始查看 IIS 配置、扩展、硬件、网络等。

在您的应用中,备份您的网络配置并从新的默认 web.config 开始。这应该禁用您已安装的任何扩展或处理程序。如果这样可以解决您的加载时间问题,请开始将旧 web.config 中的内容以小块的形式添加到新 web.config 中,直到问题再次出现,并以这种方式隔离有问题的项目。

我称之为“二分查找”调试。这很乏味,但实际上工作得很快,当我们陷入其中一个“但它应该工作!!!”时,很可能会发现问题。模式。

更新只是一个想法:要排除 IIS 配置,请尝试在 Cassini/内置开发服务器下运行该站点。

【讨论】:

  • 感谢大卫的建议。新的 MVC 项目加载速度相对较快。但是,在有问题的项目上使用默认 web.config 开始后,即使只读取了最少的部分,也会导致同样的缓慢。
  • 嗯。好吧,至少这告诉您,您的应用程序中存在导致问题的东西。您的 global.asax.cs 中有什么新内容吗?另外,你的 IIS 文件夹是本地的,对吧?
  • 我必须弄清楚如何运行 Cassini 而不是 IIS,但我会试一试。不,我的 Global.asax 中没有新内容。是的,IIS 文件夹直接从我的项目 Bin 运行。
  • 快速提问;我刚刚意识到,在 Web 选项卡上的项目属性中,我要求它使用 Visual Studio Development Server,而我没有指定 IIS 服务器。如果我在调试中遇到同样的缓慢,是否可以肯定地说 IIS 不是原因? IIS 是本地的。
  • 调试和本地浏览的应用程序都遇到同样的缓慢。
【解决方案4】:

您可以下载 Fidler 来测量每个调用需要多长时间并获得一些测量结果。

http://blogs.msdn.com/b/tess/archive/2009/11/06/recap-of-oredev-and-some-net-debugging-videos.aspx

此视频可能会有所帮助...

【讨论】:

  • 感谢您的建议,这与我发布的 DotTrace 输出有什么不同吗?它为呼叫提供时间测量。在我花时间下载、安装、记录和发布结果之前,我只需要知道(我有很多项目在我的盘子上)。
  • 您可能无法完全了解 Fidler。但是,在视频中,您可以看到 Web 应用程序变慢了,他们进行了堆栈转储,并能够分析应用程序变慢的原因。我会检查这种方法。
【解决方案5】:

解决方案是格式化并全新安装 Vista、SQL Server 2005、Visual Studio 2008、IIS6 和全部。我现在可以毫无后果地调试我最初遇到问题的同一个 webapp。这使我相信问题出在上述安装之一中,并且一定是由于软件更新或添加软件而加剧的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 2019-06-15
    • 1970-01-01
    • 2011-03-23
    • 2011-04-25
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多