簡體   English   中英

處理程序緩慢時,為什么Kestrel無法同時處理更多的HTTP連接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM