你怎么知道w3wp.exe在做什么? (或如何诊断性能问题)

我在我们制作的网站中遇到了性能问题,我不确定如何开始诊断。

简单的描述是:我们有一个非常小的网站( 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使用率如此之高。 它不应该做的太多了…所以我的问题是…

  • 有什么办法找出它在做什么? 也许甚至configuration文件?
  • 我应该看的任何性能计数器?
  • 这是硬件/软件configuration的预期吗?
  • 这是否可能是由某种configuration失败引起的,您会从哪里开始寻找?

非常感谢你。
Daniel Magliola

您还可以使用IISpipe理器内的工作进程UI,并检查当前正在执行的请求,看看它们在哪里被卡住。 打开IISpipe理器 – >单击树中的服务器 – >双击工作进程图标 – >双击正在消耗CPU的工作进程以实时查看当前正在执行的请求,以便您可以看到哪个模块需要花费时间。

另外考虑使用失败的请求追踪来追踪每个请求的一些时间,以查看他们花费很长时间的地方。

好的,开始 – 服务器真的很糟糕。 但它应该是足够的。

  • 对于虚拟化,请检查您的驱动程序。 我知道没有隐藏CPU的虚拟化平台(而且我还有人在赛扬上放置了hyper-v或esx),但是光盘驱动等是一个迹象。

  • CPU不应该那么高。 不幸的是,有了这个RAM,你几乎要敬酒 – 如果你开始添加一个探查器,你几乎会吹你的内存。

我会:

  • 检查日志执行在这个时候的东西。
  • 将操作系统升级到2008 R2 – 更多信息可在此获得。

为了testing:

  • 在您的开发环境中制作一个网站的副本,并运行一些性能testing。
  • 在那里进行分析。
  • 使用失败的REquest跟踪来找出哪些请求失败。

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超时的情况下。