我在我们制作的网站中遇到了性能问题,我不确定如何开始诊断。
简单的描述是:我们有一个非常小的网站( http://hearablog.com ),stream量很less,在一个蹩脚的专用服务器中,CPU总是很高,有时在100分钟内保持100%,而w3wp.exe正在采取大部分。 一个典型的情况是w3wp.exe占用60%,而SQL Server占用大约30%。 我们的数据库也很小。
详细描述和更多细节:
该网站由Cari.Net在一个非常蹩脚的服务器托pipe。 从一开始我们就有这样的感觉:服务器的行为不正确,就像有些事情会花费太长时间,所以这可能是一个起步的configuration问题。 也可能是我们正在获得一个虚拟服务器,而我们应该有一个专门的虚拟服务器,尽pipe我们没有证据表明这一点,除了服务器往往很慢的事实。
服务器是Windows 2008 Standard 64位,带有SQL 2008 Express
硬件是Celeron 2.80 GHz,1Gb RAM
该网站是在ASP.Net MVC中开发的,使用entity framework进行数据访问。
现在,这是非常糟糕的硬件,但我已经与这些家伙的其他服务器,具有相同(或更差)硬件,性能比这更好。 也就是说,其他服务器有W2003和SQL2005,我使用ASP.Net“WebForms”2.0,没有MVC,没有LINQ,没有EF; 所以我不确定是否要去2008年/其他的东西意味着一个很大的性能损失预计。
我经常提供MP3文件(5-20 Mb),这是一个不寻常的负载,也许是导致一些问题?
会导致w3wp使用大量的CPU?
磁盘使用率似乎非常低。 内存通常在90%左右,但磁盘使用似乎表明它不是很多的分页。
尽pipe我们所有的查询都非常简单(或者应该是,但EF可能会搞砸了),但是我每天都会收到大量关于SQL超时的电子邮件。
这是资源监视器在100%CPU的“冲刺”之一中的样子,以防有什么用处。
以及一些性能计数器的快照:
现在,我非常困惑的是w3wp的CPU使用率如此之高。 它不应该做的太多了…所以我的问题是…
非常感谢你。
Daniel Magliola
您还可以使用IISpipe理器内的工作进程UI,并检查当前正在执行的请求,看看它们在哪里被卡住。 打开IISpipe理器 – >单击树中的服务器 – >双击工作进程图标 – >双击正在消耗CPU的工作进程以实时查看当前正在执行的请求,以便您可以看到哪个模块需要花费时间。
另外考虑使用失败的请求追踪来追踪每个请求的一些时间,以查看他们花费很长时间的地方。
好的,开始 – 服务器真的很糟糕。 但它应该是足够的。
对于虚拟化,请检查您的驱动程序。 我知道没有隐藏CPU的虚拟化平台(而且我还有人在赛扬上放置了hyper-v或esx),但是光盘驱动等是一个迹象。
CPU不应该那么高。 不幸的是,有了这个RAM,你几乎要敬酒 – 如果你开始添加一个探查器,你几乎会吹你的内存。
我会:
为了testing:
http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/
在那里有一些开始。 这可能会给你一个提示,如果问题更多 – 嗯 – “可分类的”。
我也会保持长期的性能日志。 注意你的IO(秒/读,秒/写几乎是唯一相关的)。 所有其余的事情都是明智的太模糊 – 但一旦你的IO开始花费比它应该更长,光盘落后。
在这一点上,我将排除configuration问题 – 至less作为主要指标。 有些东西用完了你的W3p资源,现在你需要知道它是什么。
一般来说,这不是一个服务器,我希望有物理 – 这是如此之小,没有任何意义恕我直言有一台机器在那里。 虚拟会更好;)
您可以尝试使用名为Process Explorer的程序来监视在w3wp进程下运行的单个线程。 它应该让你看到什么线程造成的所有损害。
使用微软的debugging诊断工具来转储我的w3wp进程,然后检查线程和堆栈跟踪来查找被locking的东西,我确实非常幸运。 它甚至会告诉你所请求的页面,产生了超级好的线程。
http://www.microsoft.com/en-us/download/details.aspx?id=26798
我同意TomTom的观点,尤其是在这一点上,从虚拟获得更好的里程。 在本地进行debugging/分析以缩小问题是正确的。
我要穿上我的卡纳克神奇的帽子和斗篷,并要求第一个信封。 Ram起义。 当你把操作系统,ASP.NET和一个贪婪的SQL Server Express放到1GB时,你会得到什么?
我相信你的问题是,SQL Server Express正在为缓冲池提供所有可用的RAM,并且缓慢释放它。 请参阅http://support.microsoft.com/kb/321363以获取更多信息。 此外,IIS有一个256MB的默认caching,您可能需要调整( https://stackoverflow.com/questions/2853135/controlling-asp-net-output-cache-memory-usage )。 debugging诊断是一个很好的工具来解决这个问题(好吧,可能是一个大锤)。
http://technet.microsoft.com/en-us/library/bb742546.aspx是一个相当不错的文章来看看。 http://social.technet.microsoft.com/forums/en-US/sharepointadmin/thread/706c653a-16b0-4696-85ee-9ae3552a582e指向应用程序池回收已经疯了作为另一个可能的问题。
使用Perfmon的“进程”计数器来查看w3wp.exe进程的各个属性。 工作进程的CPU时间有多less是内核时间? 高内核时间可能表示寻呼,但是你说你不相信。 其他的可能性是duff司机。 工作进程有23个线程活动,这是好的,但他们在做什么? 尝试SysInternals的ProcessExplorer挖掘更多; 您还可以看到正在使用的TCP / IP连接。 我没有使用过SQL Express,但是它有像内存调整参数那样的大哥哥。 SQL饿死内存的IIS,导致过度分页?
这可能不完全相关,但请确认您是否在查询中使用了NOLOCK。 这可能有助于在SQL超时的情况下。