你好!
我在运行Windows 2008服务器上的IIS7。
在高峰时段,我们会出现以下行为:
- CPU负载接近空闲
- 请求排队(使用资源监视器进行监控)
- 执行时间超过10秒
1-4) 请查看之前的版本和编辑
5) 异步执行任务
建议如下,我创建了一个简单的Web页面,并附带以下代码:
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>