【发布时间】:2011-11-26 16:24:37
【问题描述】:
喂!
我在 Windows 2008 服务器上运行 IIS7。
在偷看时间,我们有以下行为:
- CPU 负载接近空闲
- 请求排队(由资源监视器监控)
- 执行时间超过 10 秒
1-4) 请查看以前的版本和修改
5) 异步处理
按照建议,我创建了一个简单的网页...一页...使用此代码隐藏:
using System;
using System.Threading;
using System.Web;
using System.Web.UI;
namespace PerformanceTest
{
public partial class AsyncPage : Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
var pageAsyncTask = new PageAsyncTask(this.BeginAsyncOperation, this.EndAsyncOperation, this.TimeoutAsyncOperation, null);
this.RegisterAsyncTask(pageAsyncTask);
// or
//this.AddOnPreRenderCompleteAsync(this.BeginAsyncOperation, this.EndAsyncOperation);
// this might be useful for doing cleanup or sth alike
this.PreRenderComplete += HandlePreRenderComplete;
}
private void HandlePreRenderComplete(object sender, EventArgs e)
{
this.Trace.Write("HandlePreRenderComplete");
this.Trace.Write(string.Format("managedThreadId #{0}", Thread.CurrentThread.ManagedThreadId));
}
private delegate void Sleep(int miliseconds);
private IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback asyncCallback, object state)
{
this.Trace.Write("BeginAsyncOperation");
this.Trace.Write(string.Format("managedThreadId #{0}", Thread.CurrentThread.ManagedThreadId));
var sleep = new Sleep(Thread.Sleep);
return sleep.BeginInvoke(1000, asyncCallback, state);
}
private void EndAsyncOperation(IAsyncResult asyncResult)
{
this.Trace.Write("EndAsyncOperation");
this.Trace.Write(string.Format("managedThreadId #{0}", Thread.CurrentThread.ManagedThreadId));
}
private void TimeoutAsyncOperation(IAsyncResult asyncResult)
{
this.Trace.Write("TimeoutAsyncOperation");
this.Trace.Write(string.Format("managedThreadId #{0}", Thread.CurrentThread.ManagedThreadId));
}
}
}
看起来很不错,不是吗?实际上它没有任何变化,因为压力超过 30 秒,响应时间上升到 8 秒,CPU 使用率接近 0%。
6) 更新 machine.config
<system.net>
<connectionManagement>
<add address="*" maxconnection="12" />
</connectionManagement>
</system.net>
<system.web>
<processModel autoConfig="true"
maxWorkerThreads="100"
maxIoThreads="100"
minWorkerThreads="50"
minIoThreads="50" />
<httpRuntime minFreeThreads="88"
minLocalRequestFreeThreads="76" />
</system.web>
【问题讨论】:
-
利用异步将提高性能,因为线程将返回到请求池,并且您将拥有更高程度的并行性。不过,这将意味着严重的重新编程。
-
@MikaelÖstberg 我知道 - 这就是我编辑问题的原因。这只是一个短镜头......当前的峰值可能会变得更糟:(......异步页面将是实现这样一个页面的正确方法,但我不是创造者 - 只是改变者:)
标签: asp.net performance iis-7