Visual Studio 2010 - 网站构建后的高CPU利用率

时间:2011-07-07 14:08:47

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

我正在使用Visual Studio 2010中的VB.NET网站。该项目设置为在IIS 7的本地实例中运行网站。如果我只是访问网站http://localhost/mywebsite,则网站正常运行并且进程w3wp.exe正如我所期望的那样跳跃大约2-3%的CPU利用率。一旦我在Visual Studio中运行了一个网站构建,w3wp.exe进程就会高达25%的CPU利用率,并且当我转到IE并测试网站时它会保持不变。如果我再次构建,w3wp.exe进程会跳升到大约50%的CPU利用率,并且当我再次转向IE并测试网站时它会保持在那里。这个过程一直持续到我达到90-100%的CPU使用率,我必须杀死w3wp.exe进程,以便网站重新开始。

有谁知道为什么会这样,以及如何解决它。我认为这与IIS试图使用的Visual Studio覆盖DLL有关。是否最好在后期构建任务中添加app pool reset命令?

我承认我可以运行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位模式运行,则重建时不会出现CPU峰值,就像应用程序以64位模式运行时一样。

1 个答案:

答案 0 :(得分:1)

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