尝试在IIS和ASP.NET中达到100%的CPU利用率

时间:2012-08-11 22:33:50

标签: c# asp.net iis-7.5 cpu-usage

我正在开发一个大量使用CPU的ASP.NET Web服务应用程序。我注意到在4核服务器上,CPU未得到充分利用。所以我想出了一个简单的服务,看看是否有可能达到100%的CPU。在这里。

调用客户端使用并发线程和重复消息来攻击此服务器。每个请求需要0.5到2秒才能完成(取决于线程数)。所有4个内核的最高CPU使用率为80%。如果我使用4个线程或16个线程,1个客户端或2个客户端,我得到相同的结果。 2核盒有同样的问题。

那么,是否有可能在多核IIS服务器上达到100%的CPU,代码不是无限循环?

public class MyHttpHandler : IHttpHandler
{
    public bool IsReusable  { get { return true; } }

    public void ProcessRequest( HttpContext context )
    {
        switch( context.Request.HttpMethod )
        {
            case "GET":
            {
                string s = "";
                for( int i = 0; i < 999999; ++i )
                {

                    s = s.Substring( s.Length / 2 );
                    s += i.ToString();
                }
                context.Response.Output.WriteLine( "<html><body><h1>Web Service - " + s + "</h1></body></html>" );
                context.Response.StatusCode = 200;
                break;
            }
            default:
            {
                context.Response.StatusCode = 405;
                break;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

你正在全速生成垃圾。这会触发很多GC。在GC发生之前和之后,在短暂的持续时间内必须停止所有线程。这可以防止进程使CPU饱和。

加入算术循环。 Thread.SpinWait不保证CPU使用率,因为它在内部要求Windows取消当前线程的计划。它不是一个简单的“无限”循环。

答案 1 :(得分:1)

您可以将线程放入SpinWait进行大量迭代。这不是一个无限循环,但可能会运行很长一段时间。

Thread.SpinWait(Int32.MaxValue);