Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么';当处理程序运行缓慢时,t Kestrel会同时处理更多HTTP连接吗?_Performance_Asp.net Core_Asp.net Core Webapi_Kestrel Http Server - Fatal编程技术网

Performance 为什么';当处理程序运行缓慢时,t Kestrel会同时处理更多HTTP连接吗?

Performance 为什么';当处理程序运行缓慢时,t Kestrel会同时处理更多HTTP连接吗?,performance,asp.net-core,asp.net-core-webapi,kestrel-http-server,Performance,Asp.net Core,Asp.net Core Webapi,Kestrel Http Server,我有一个默认的ASP.NET核心Web API应用程序,该应用程序只有一个处理程序: [HttpGet("{x}")] public string Get(string x) { var guid = Guid.NewGuid(); var start = DateTime.Now; Console.WriteLine($"{guid}\t1\tSTRT\t{start}"); var sb = new StringBuilder(); using (va

我有一个默认的ASP.NET核心Web API应用程序,该应用程序只有一个处理程序:

[HttpGet("{x}")]
public string Get(string x)
{
    var guid = Guid.NewGuid();
    var start = DateTime.Now;
    Console.WriteLine($"{guid}\t1\tSTRT\t{start}");
    var sb = new StringBuilder();
    using (var conn = new OracleConnection(CONN_STR)) {
        using (var cmd = conn.CreateCommand()) {
            conn.Open();

            Console.WriteLine($"{guid}\t2\tCONN\t{DateTime.Now - start}");

            cmd.CommandText = "select hello4(:x) from dual";

            var nameParam = cmd.CreateParameter();
            nameParam.ParameterName = "x";
            nameParam.Value = x;
            cmd.Parameters.Add(nameParam);

            var ret = cmd.ExecuteScalar();

            if (ret is string xname) {
                sb.Append("{\"x\":");
                sb.Append(x);
                sb.Append("\",\"xname\":\"");
                sb.Append(xname);
                sb.Append("\"}");
            } else {
                sb.Append("{\"error\":\"no data found\"}");
            }
        }
    }
    Console.WriteLine($"{guid}\t3\tDONE\t{DateTime.Now - start}");
    return sb.ToString();
}
我使用vegeta对其进行负载测试:
vegeta攻击-targets=targets.txt-持续时间=10s-速率=100-超时=0 | vegeta报告

hello4
很快时,我可以在stdout中看到处理程序每秒被调用100次

hello4
包含
dbms\u lock.sleep(1)时为了模拟额外的处理时间,我发现每秒调用处理程序的次数要少得多,大约20次。实际上,我希望它仍然每秒被调用100次,这会给数据库带来额外的压力,并耗尽SGA(我的连接池限制是1024)


为什么不会发生这种情况?我如何强制它同时开始处理更多传入连接?

任务中运行
cmd.ExecuteScalar
是正确的想法,但它必须是一个长时间运行的任务,以避免阻塞应用程序池中的所有线程:

private static TaskFactory<object> tf = new TaskFactory<object>();
//and in the method
await tf.StartNew((Func<object>)cmd.ExecuteScalar, TaskCreationOptions.LongRunning).ConfigureAwait(false);
private static TaskFactory tf=new TaskFactory();
//在方法上,
wait tf.StartNew((Func)cmd.ExecuteScalar,TaskCreationOptions.longlunning)。configurewait(false);

这使得Kestrel能够以传入连接到达的速率继续处理它们。

FYI,
var ret=wait Task.Run((Func)cmd.ExecuteScalar)没有帮助。
.UseKestrel(options=>{options.Limits.MaxConcurrentConnections=null;options.Limits.MaxConcurrentUpgradedConnections=null;})
在构建
IWebHost时也没有帮助。