生产服务器上的 ASP.NET 网站性能缓慢
Posted
技术标签:
【中文标题】生产服务器上的 ASP.NET 网站性能缓慢【英文标题】:ASP.NET Website Slow Performance on production server 【发布时间】:2010-11-23 08:05:20 【问题描述】:我的问题是我的 ASP.NET 网站在我的生产服务器上的运行速度比在我的开发服务器上慢。
在我的开发环境中以 120 毫秒执行的页面需要 400 毫秒才能在服务器上执行。我已经使用分析器监视了 SQL 服务器,并且在服务器上花费 400 毫秒的页面上运行的查询只需要大约 50 毫秒即可完成 - 所以我确信我的问题不在于 SQL 服务器。
我的开发机器是配备 6GB 内存的 Intel I7,生产服务器是配备 16GB 内存的 2x AMD 四核。
【问题讨论】:
你如何测量速度? 一个HttpModule中的秒表,基本上测量的时间就是从BeginRequest到EndRequest事件需要多长时间。 我尝试在服务器上我的项目的空白页面上运行一些测试。 1. 我设置了一个简单的循环,里面有一个非常简单的计算,这实际上在服务器上执行比在我的开发机器上执行得更快。 2. 我更改了循环以从我的类库中调用一个从数据库中提取信息的函数。这在服务器上速度较慢。 3.我又改了一次,但是这次调用了一个与服务器没有交互的函数,再次在服务器上变慢了。也许它与我的类库有关?关于如何解决它的任何好主意? 在第三次测试中,不与服务器交互,我的意思是不与数据库交互。 只是为了澄清,整个网站速度较慢,不仅仅是示例中使用的一页。 【参考方案1】:您可以考虑一些点来提高您网站的性能。
-
设置 debug=false
除非需要,否则关闭跟踪
如果不需要,请关闭会话状态。
ASP.NET 自动管理会话状态。但是,如果您不需要 Session,禁用它将有助于提高性能
在不需要时禁用 ViewState。
避免频繁往返数据库
避免引发异常。
异常是处理应用程序逻辑中发生的错误的好方法。但是,抛出异常是一种昂贵的资源,必须避免。使用特定的异常并尽可能少地使用以避免资源开销
使用缓存来提高应用程序的性能。
使用 finally 方法杀死资源
编辑: 使用本网站衡量您的网站性能 http://www.websiteoptimization.com/services/analyze/ http://www.websitepulse.com/
【讨论】:
这些肯定都是很棒的技巧,但在优化任何东西之前,我希望我的服务器实际上执行得与我的开发机器的性能有点接近,并且速度不会慢 3 倍 - 这太荒谬了! 【参考方案2】:您检查过 web.config 中的 debug=false 吗?
服务器是 64 位的吗? 尝试为您的应用程序创建一个专用的应用程序池,并将应用程序池设置为以 32 位经典模式运行。 有什么区别吗?
您的类是预编译的还是设置为在运行时编译?
【讨论】:
按说开发上会这样对吧? 我试过改变这个值,它没有太大的区别。 在我的回答中增加了 2 个选项。 我已经尝试过预编译和复制项目文件,这只会在页面第一次运行时真正产生影响。开发和生产都是 64 位的,不确定 32 位经典模式到底是什么意思,但是将管道设置为经典会引发异常并出现配置错误,告诉我它找不到我的程序集之一。我将 Enable 32-Bit Applications 更改为 TRUE,之前是 FALSE,这似乎带来了性能提升,之前的 ~400ms 现在是 ~300ms,但仍然不是我的开发服务器的 120ms。 也在我的开发机器上改变了这个,现在它更快了,但这也意味着性能方面的差距没有改变。 :( 感谢您的提示!:)【参考方案3】:在您的页面中设置 Trace="true" (
【讨论】:
从跟踪中可以看出,大部分执行时间来自页面加载事件。 那么页面加载事件是什么?? 在我的开发机器上运行得更快的所有逻辑:P【参考方案4】:您的 SQL 服务器是否在另一台生产服务器上,但在本地开发?
【讨论】:
SQL server 和 IIS 在同一台服务器上运行【参考方案5】:阅读所有建议后,似乎没有任何效果,开始一点一点地从您的网站中取出代码,看看这对时间有何影响。一次删除大约 10 行代码或 html,看看是否有很大的不同。
否则,它可能与 IIS 有关,抱歉,我不是 IIS 专家。
【讨论】:
我尝试从网站上删除某些性能密集型功能,虽然它明显提高了性能,但似乎服务器在执行代码时通常更慢,无论如何..虽然,我确实进行了一个简单的 for 循环测试(在我的原始帖子中对此进行了评论),其中服务器将比我的开发机器更快地处理简单循环,1000 万次迭代在生产机器上更快 - 但是一旦我被调用一些驻留在我的类库生产服务器会更慢..【参考方案6】:大量视图状态导致传输延迟?
【讨论】:
我已经尝试在 web.config 中禁用 ViewState,可能会有轻微的改进,但与开发机器相比,我们在服务器上的执行时间仍然慢了 3 倍...【参考方案7】:这是您服务器上唯一的网站吗? 16 GB 是相当不错的内存,但如果同一台服务器上有许多流行网站,它们可能会占用资源和 CPU 时间。
除此之外,我想不出您的网站生产速度比开发速度慢的任何原因。
您检查过索引吗?他们都在服务器上?
【讨论】:
服务器上目前唯一运行的就是这个网站。【参考方案8】:你需要减少变量。
尝试消除两种环境之间的所有差异,然后一一进行更改,直到弄清楚它是什么。
确保两个环境中的 web.config 相同。 确保两个环境都指向第三个盒子上的同一个数据库服务器。 确保两个环境中的 IIS 版本相同。 确保 IIS 在两种环境中的配置相同。 在两种环境中运行相同的测试数据。 等等……
【讨论】:
我正在尝试,但我不知道此时我还能做些什么,除了在第三台服务器上运行数据库之外,我可以检查您列表中的所有内容,因为那不是不适合我。【参考方案9】:在我的开发机器和生产机器的性能差异问题上撞了很久之后,我终于屈服于我内心深处的感觉,处理器实际上比你会想的。
我从基于 AMD 的解决方案更改为基于英特尔的解决方案(至强!),获得了 0.3GHz 和更快的磁盘。
我还获得了性能提升,而不是像我的开发机器那样慢 3 倍,现在降低到大约 x0.75 倍 - 显然仍然不是我的开发机器能够达到的闪电速度,但它越来越接近。
在进一步调试时,我注意到大部分性能消耗(这并不奇怪)来自 LINQ to SQL 必须编译查询,但我觉得奇怪的是,一旦我尝试预编译 LINQ 查询并运行在我的两台机器上都是一样的,结果发现开发机器更快。
【讨论】:
我认为从“调试”切换到“生产”所带来的性能提升将超过任何负面的处理器差异。 想知道您的生产服务器在处理器切换前后的 cpu 利用率是多少?【参考方案10】:如果您已经研究了所有可能的代码优化,但仍然面临性能问题,这可能是原因:
检查您的 Web.config 并删除以下内容。
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers></system.codedom>
如果您进行预编译并且只使用网络服务器上已编译的程序集,则可以安全地从 web.config 中删除这些。
【讨论】:
以上是关于生产服务器上的 ASP.NET 网站性能缓慢的主要内容,如果未能解决你的问题,请参考以下文章