簡體   English   中英

在異步 controller 中測量 http 請求的 CPU 時間

[英]Measuring cpu time for http request in async controller

我正在閱讀關於處理過載的谷歌 SRE 書籍章節: https://sre.google/sre-book/handling-overload/

他們提到:

這個難題的一個有趣部分是實時計算每個單獨請求所消耗的資源量,特別是 CPU。 對於沒有實現每個請求的線程 model 的服務器來說,這種計算特別棘手,其中線程池使用非阻塞 API 在所有請求進入時執行它們的不同部分。

我知道在每個請求的線程 model 中,我們可以簡單地調用 getrusage(RUSAGE_THREAD, &r); 但是在具有異步方法的 ASP.net Controller 中,不能保證“await”關鍵字之前和之后的代碼將在同一線程上執行。 即使是這樣,線程也有可能為其他 http 請求執行代碼。

那么有沒有辦法測量異步 function 使用了多少 CPU 時間。

托管 memory 分配將導致在其他線程中完成的 GC 工作。 緩存在其他線程中管理。

測量直接依賴於請求的任何內容都是誤導性的。

如果您有性能問題,您應該收集指標、ETW 跟蹤、memory 轉儲並分析它們。

找到了一個 Nuget 這提供了這個功能。

https://github.com/devizer/Universe.CpuUsage

使用 class CpuUsageAsyncWatcher

public void Configure(IApplicationBuilder app)
{
    // Here is a "middleware" that displays total CPU usage
    // of all the Tasks executed by ASP.NET Core pipeline during each http request
    app.Use(async (context, next) =>
    {
        CpuUsageAsyncWatcher watcher = new CpuUsageAsyncWatcher();
        await next.Invoke();
        watcher.Stop();
        Console.WriteLine($"Cpu Usage by http request is {watcher.GetSummaryCpuUsage()}");
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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