3

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

调用客户端使用并发线程和重复消息攻击此服务器。每个请求需要 0.5 到 2 秒才能完成(取决于线程数)。它达到的最高 CPU 使用率是所有 4 个内核的 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;
            }
        }
    }
}
4

2 回答 2

4

您正在全速生成垃圾。这会触发大量 GC。在可能发生 GC 之前和之后,必须在短时间内停止所有线程。这可以防止进程使 CPU 饱和。

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

于 2012-08-11T23:48:29.783 回答
1

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

Thread.SpinWait(Int32.MaxValue);
于 2012-08-11T22:42:10.273 回答