[英]Why doesn't Kestrel handle more HTTP connections simultaneously when handlers are slow?
我有一個帶有單個處理程序的默認ASP .NET Core 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 attack -targets=targets.txt -duration=10s -rate=100 -timeout=0 | vegeta report
vegeta attack -targets=targets.txt -duration=10s -rate=100 -timeout=0 | vegeta report
。
當hello4
快速時,我可以在標准輸出中看到該處理程序每秒被調用100次。
當hello4
包含dbms_lock.sleep(1);
為了模擬額外的處理時間,我發現處理程序每秒被調用的次數要少得多,大約為20次。我實際上希望它每秒仍被調用大約100次,這給數據庫帶來了更多壓力,並耗盡了SGA(我的連接池)限制為1024)。
為什么沒有發生這種情況,我怎么能迫使它開始同時處理更多的傳入連接?
在Task
運行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);
這使Kestrel能夠以到達的速率繼續處理傳入的連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.