Performance 为什么';当处理程序运行缓慢时,t Kestrel会同时处理更多HTTP连接吗?
我有一个默认的ASP.NET核心Web API应用程序,该应用程序只有一个处理程序: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
[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时也没有帮助。