我正在开发一个大量使用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;
}
}
}
}
答案 0 :(得分:4)
你正在全速生成垃圾。这会触发很多GC。在GC发生之前和之后,在短暂的持续时间内必须停止所有线程。这可以防止进程使CPU饱和。
加入算术循环。 Thread.SpinWait
不保证CPU使用率,因为它在内部要求Windows取消当前线程的计划。它不是一个简单的“无限”循环。
答案 1 :(得分:1)
您可以将线程放入SpinWait
进行大量迭代。这不是一个无限循环,但可能会运行很长一段时间。
Thread.SpinWait(Int32.MaxValue);