【问题标题】:Visual Studio 2010 - High CPU Utilization after website buildVisual Studio 2010 - 网站构建后 CPU 利用率高
【发布时间】:2011-07-07 14:08:47
【问题描述】:

我正在使用 Visual Studio 2010 开发一个 VB.NET 网站。该项目设置为在 IIS 7 的本地实例中运行该网站。如果我只是访问该网站,http://localhost/mywebsite,该网站运行正常,并且正如我所料,w3wp.exe 进程的 CPU 利用率会提高 2-3%。当我在 Visual Studio 中运行网站的构建时,w3wp.exe 进程的 CPU 利用率会上升到 25%,当我切换到 IE 并测试网站时,它会一直保持在那里。如果我再次构建,w3wp.exe 进程会跃升至大约 50% 的 CPU 使用率,并且当我再次切换到 IE 并测试网站时它会保持在那里。这个过程一直持续到我达到 90-100% 的 CPU 使用率,我必须终止 w3wp.exe 进程,以便网站重新启动。

有谁知道为什么会发生这种情况,以及如何解决它。我认为这与 Visual Studio 覆盖 IIS 尝试使用的 DLL 有关。是否最好将应用程序池重置命令添加到构建后任务?

我承认我可以运行 IIS Express 或 Visual Studio 开发服务器,但我们更喜欢使用完整版本的 IIS 7 进行测试,以确保我们拥有与生产环境相同的测试环境。

感谢您提供的任何帮助。

编辑 我已经缩小了问题的范围。在 Jeremy 在下面询问有关 Application_Start 中运行的任何内容之后,我发现问题是我在应用程序启动中的代码造成的。如果我注释掉我的代码以加载一些带有数据的静态集合,我不会在重建时获得 CPU 峰值。那么基于此,你知道为什么当我重建项目时,CPU 会根据一些代码来加载静态集合以加载数据吗?

这是我正在使用数据加载静态对象的示例:

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    MyObjects.Load(connectionString)
End Sub    

Public Class MyObjects
    Private Shared _objects As Dictionary(Of String, Dictionary(Of String, MyObject)) = Nothing
    Private Shared _lockObject As New Object
    Private Shared _connectionString As String = Nothing

    Shared Sub New()
    End Sub

    Shared Sub Load(ByVal s As String)
        Dim qry As StringBuilder = Nothing
        Dim dt As DataTable = Nothing
        Dim tempDefHolder As Dictionary(Of String, Dictionary(Of String, MyObject)) = Nothing

        qry = New StringBuilder()
        qry.AppendLine("my query")

        _connectionString = s

        dt = New DataTable()

        Using conn As New OracleConnection(_connectionString)
            Using cmd As New OracleCommand(qry.ToString(), conn)
                Using da As New OracleDataAdapter(cmd)
                    conn.Open()
                    da.Fill(dt)
                End Using
            End Using
        End Using

        tempDefHolder = LoadMyObjectsFromDataTable(dt) '(turns datatable into dictionary of objects

        'assign _objects using synclock
        SyncLock _lockObject
            _objects= tempDefHolder
        End SyncLock
    End Sub
End Class

另一个编辑 目前,该应用程序配置为在 IIS 7 中以 64 位运行,但它是为“任何 CPU”编译的。如果我将 IIS 中的应用程序池更改为“启用 32 位应用程序”以使其在 32 位模式下运行,则在重建时不会像在 64 位模式下运行应用程序时那样出现 CPU 峰值。

【问题讨论】:

  • 这可能在您的应用程序代码中。仅仅因为您停止调试并且浏览器窗口关闭,并不意味着已启动的请求将停止。你的 global.asax 中有什么不寻常的地方吗?
  • 我实际上从未进入调试模式。我正在针对 IIS 7 的本地实例运行,所以它永远不会停止。我在 global.asax 中加载了一些静态对象。虽然我不能 100% 确定加载这些对象的代码没有错误,但我认为这不是问题所在。正如我上面所说,代码第一次运行时,它的行为正常,只是额外的构建使 CPU 达到峰值。

标签: vb.net visual-studio-2010 iis iis-7


【解决方案1】:

经过许多浪费时间试图弄清楚这一点。我将问题缩小到我的 64 位 ODP.net dll 版本。我刚刚去了 Oracle 的网站并下载了 ODP.net 的最新更新,问题就解决了。他们在我的版本和最新版本之间修复了一定是他们的代码中的一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2022-06-16
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多