3

CPUを多用するASP.NETWebサービスアプリケーションに取り組んでいます。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内部的に Windows に現在のスレッドのスケジュールを解除するように要求するため、CPU 使用率は保証されません。単純な「無限」ループではありません。

于 2012-08-11T23:48:29.783 に答える
1

SpinWait非常に多くの反復のためにスレッドを に入れることができます。これは無限ループではありませんが、おそらく長時間実行されます。

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