【问题标题】:Console app slower than asp.net app控制台应用程序比 asp.net 应用程序慢
【发布时间】:2013-03-17 09:15:20
【问题描述】:

我有一个爬虫机器人,它使用 parallel.for 和 parallel.foreach 并行下载各种页面。 MaxDegreeOfParallelism 设置为 20 左右,因为增加它似乎不会进一步提高性能,而且我不想让任何 Web 服务器过载。

当我从 ASP.NET 网站(所有地方)开始爬网时,它以可接受的性能运行,这一切都需要几个小时。由于此设置的设计问题,我正在更改此设置,以便可以从控制台启动它。

我需要的所有代码都在一个 dll 中,网站和控制台应用程序都可以访问它。

除了启动消息外,控制台没有输出。

问题是当我从控制台(或从调试器)运行它时,它比从 ASP.NET 网站运行它花费的时间大约长 10 倍(!)。如果 ASP.NET 版本比控制台慢,我会更容易理解。

为什么会这样,或者我该如何调试或找出原因或解决问题?

编辑: 通过 Visual Studio 调试器尝试两种变体时也会发生这种情况。 从“调试”到“输出”窗口的输出类似于:

线程 '' (0x1d34) 以代码 0 (0x0) 退出。 线程 '' (0xf20) 以代码 0 (0x0) 退出。 线程 '' (0x3414) 以代码 0 (0x0) 退出。 线程 '' (0x35c8) 以代码 0 (0x0) 退出。 线程 '' (0xdc) 以代码 0 (0x0) 退出。 线程 '' (0x1c98) 以代码 0 (0x0) 退出。 线程 '' (0x3308) 以代码 0 (0x0) 退出。 线程 '' (0x2b00) 以代码 0 (0x0) 退出。 线程 '' (0x2f7c) 以代码 0 (0x0) 退出。 线程 '' (0x345c) 以代码 0 (0x0) 退出。 线程 '' (0x2a18) 以代码 0 (0x0) 退出。 线程 '' (0x138) 以代码 0 (0x0) 退出。 线程 '' (0x3650) 以代码 0 (0x0) 退出。 线程 '' (0x376c) 已退出,代码为 0 (0x0)。

除了在 ASP.NET 情况下,此文本的编写速度快了大约 10 倍。

也许还值得一提的是,该 dll 通过 COM 为每个下载的页面调用 7zip 来压缩它。

【问题讨论】:

  • 您是否在两种情况下都在同一硬件上运行代码?
  • 是的,所有这些都在我的开发机器上运行。
  • 它会从同一个服务器下载大量页面吗? ServicePointManager.DefaultConnectionLimitServicePointManager.MaxServicePoints 在这两种环境中的值是多少?您是否试图找出减速的​​确切位置?
  • 这里的信息太少,只能猜测原因。 @svick 的建议很好。您需要进行一些分析以确定减速的位置。
  • @svick 它试图同时从同一个主机名下载很多页面,是的。 DefaultConnectionLimit=2 用于控制台应用程序,DefaultConnectionLimit=2147483647 用于 ASP.NET 应用程序。 (ASP.NET 和控制台应用程序的设置之间是否存在其他主要差异?)在控制台应用程序启动时将 DefaultConnectionLimit 更改为 80 使控制台应用程序几乎与 ASP.NET 应用程序一样快。如果你写你的评论作为答案,我会接受。

标签: c# asp.net performance task-parallel-library parallel.foreach


【解决方案1】:

如果您从同一服务器下载大量页面,您将遇到ServicePointManager.DefaultConnectionLimit 设置的限制。默认值通常是 2 (as suggested by the HTTP 1.1 RFC),但对于 ASP.NET 应用程序来说似乎是 10。如果您看到不同的数字,则很可能是某些东西更改了默认值。

当您达到此限制时,框架将不再与该特定服务器(或“端点”)建立任何连接,因此您的大多数线程将阻止不做任何事情。

您可以通过更改 DefaultConnectionLimit 的值来解决此问题,但更好的解决方案可能是更改请求的顺序,这样您就不会同时向同一服务器发出许多请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多